Своенравный 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, время: 03:28. |