Ненужное переопределение this во вложенных объектах
Добрый день!
Ситуация вот какая. Есть базовый объект View: var View = function() { } View.prototype = $('<div />'); View.prototype.parent = {}; View.prototype.constructor = View; И два дочерних объекта - к примеру, ViewA и ViewB: var ViewA = function() { this.parent.constructor.call(this); } ViewA.prototype = new View(); ViewA.prototype.parent = new View(); ViewA.prototype.constructor = ViewA; ViewA.prototype._viewBInstance = null; var ViewB = function() { this.parent.constructor.call(this); } ViewB.prototype = new View(); ViewB.prototype.parent = new View(); ViewB.prototype.constructor = ViewB; И вот, при попытке сделать внутри ViewA такую операцию: this._viewBInstance = new ViewB(); внутри конструктора ViewB переменная this ссылается на экземпляр ViewA, внутри которого это делается. Это просто поставило меня в тупик, и теперь я не знаю, как жить дальше. |
А вы бы наворотили ещё побольше бы...
В чём проявляется, что this ссылается на ViewA? В каком месте? Как это воспроизвести? |
В сложном приложении сложные навороты ) Вообще говоря, это попытка перенести одну из реализаций паттерна MVC с AS3 на JS. Но в AS3 нету фишки с переопределением this.
Проявляется это в том, что в console.log(this) - ViewA. Вот, например, простой скрипт, без привязки к jQuery, на котором это проявится. В консоли Firefox'а (Firebug) будет <div id="view-a">. При тестировании обнаружилось, что в Chrome на this выводится ViewB, а id все равно равно "view-a". var View = function() { } View.prototype = document.createElement('div'); View.prototype.parent = {}; View.prototype.constructor = View; var ViewA = function() { //Опознавательный знак this.setAttribute('id', 'view-a'); this.parent.constructor.call(this); } ViewA.prototype = new View(); ViewA.prototype.parent = new View(); ViewA.prototype.constructor = ViewA; ViewA.prototype._viewBInstance = null; ViewA.prototype.setBInstance = function() { this._viewBInstance = new ViewB(); } var ViewB = function() { //Проверка this console.log(this); console.log(this.id); this.parent.constructor.call(this); } ViewB.prototype = new View(); ViewB.prototype.parent = new View(); ViewB.prototype.constructor = ViewB; //Собственно, проверка var va = new ViewA(); va.setBInstance(); |
не могу это всё в голове представить, но скорее всего потому что в качестве корневого прототипа разделяется один объект div'а:
View.prototype = document.createElement('div'); ему id и ставится, с него и считывается |
Да, действительно. Если убрать наследование от div'а, все заработает:
var View = function() { } View.prototype = {}; View.prototype.parent = null; View.prototype.constructor = View; В этом случае будет правильный this, а id будет undefined. Выходит, не получится наследовать View от элемента DOM. А ведь было бы удобно. |
Maxmaxmахimus,
Уже выяснили, в чем дело, спасибо ) |
Часовой пояс GMT +3, время: 04:41. |