Своенравный this
var test = {
demo: function() {
console.log(this);
}
}
test.demo(); // logs the "test" object
var test2 = test.demo;
test2(); // logs "DOMWindow"
test.demo.apply("Cheese"); // logs "String"
o={x: 42, test: function() { console.log(this.x); }}
document.body.onclick = o.test; // undefined печатает
document.body.onclick = o.test.bind(o); // а так работает
Как вот эта проблема обходится в javascript? |
C bind'ом например нельзя удалить обработчик (ну если созданную с помощью него функцию не запонить)
|
Она не обходится, просто загоняют внутырь this покороче, типа _=this в конструкторе и капец.
С тех пор как я несколько раз напоролся на этот сук - так больше не делаю, гребись они конем эти объекты. Нарисовал приватных методов, вывел в интерфейс что надо - так все четко работает. |
Но там тогда есть своя подстава. В js же нельзя явно определить реф, он там сам себе кумекает как хочет, то рефит то не рефит. Разбираться с этим киселем все некогда, в общем
var func = function(){
var inner_obj = {one:1};
/* blah-blah */
return {
outer_obj:inner_obj;
}
};
и матка рвется. Наружный обж сам по себе, внутрений сам по себе, а вроде как обжи оба. |
Кстати да, а кто знает как сделать такой обж, наподобие тех, которые из ДОМа получаем и которые при любой передаче остаются live и ап ту дате?
|
Цитата:
var test = {
demo: () => {
//тело функции
}
}
|
У меня возникли сложности с примером типо этого. Дело в том что если производишь действия типа этого `test = obj.test`, то при вызове test this ссылается уже на window, так же и у меня было когда обработчик пихал в массив
function Signal(context) {
var self = this
, callbacks = [];
self.add = function(callback) {
if (-1 == callbacks.indexOf(callback)) {
callbacks.push(callback);
} else {
// throw Exception?
}
console.log(callbacks);
};
self.remove = function(callback) {
var index = callbacks.indexOf(callback);
if (index != -1) {
callbacks.splice(index, 1);
} else {
// throw Exception?
}
console.log(callbacks);
};
self.removeAll = function() {
callbacks = [];
};
self.emit = function() {
for (var i = 0, len = callbacks.length; i < len; ++i) {
callbacks[i].apply(context, arguments);
}
};
}
function Controller() {
var self = this;
var model = {
value: 'foo',
changed: new Signal(self),
change: function(value) {
if (model.value != value) {
model.value = value;
model.changed.emit();
}
}
};
var view = {
informChange: function(val) {
alert("New value of the model is " + val);
}
};
model.changed.add(function() {
view.informChange(model.value);
});
self.run = function() {
setTimeout(model.change, 3000, 42);
};
}
var controller = new Controller();
controller.run();
|
Цитата:
|
Цитата:
|
nerv_,
нуу.. автор про классы ничего не говорил) А вообще, на сколько я знаю, такое должно появиться в ES7. |
| Часовой пояс GMT +3, время: 19:17. |