Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.04.2012, 20:15
Аватар для Mirror13
Новичок на форуме
Отправить личное сообщение для Mirror13 Посмотреть профиль Найти все сообщения от Mirror13
 
Регистрация: 14.04.2012
Сообщений: 9

Ненужное переопределение 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, внутри которого это делается.

Это просто поставило меня в тупик, и теперь я не знаю, как жить дальше.
Ответить с цитированием
  #2 (permalink)  
Старый 14.04.2012, 21:20
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

А вы бы наворотили ещё побольше бы...

В чём проявляется, что this ссылается на ViewA? В каком месте? Как это воспроизвести?
Ответить с цитированием
  #3 (permalink)  
Старый 15.04.2012, 00:19
Аватар для Mirror13
Новичок на форуме
Отправить личное сообщение для Mirror13 Посмотреть профиль Найти все сообщения от Mirror13
 
Регистрация: 14.04.2012
Сообщений: 9

В сложном приложении сложные навороты ) Вообще говоря, это попытка перенести одну из реализаций паттерна 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();

Последний раз редактировалось Mirror13, 15.04.2012 в 01:23.
Ответить с цитированием
  #4 (permalink)  
Старый 15.04.2012, 01:38
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

не могу это всё в голове представить, но скорее всего потому что в качестве корневого прототипа разделяется один объект div'а:

View.prototype = document.createElement('div');

ему id и ставится, с него и считывается
Ответить с цитированием
  #5 (permalink)  
Старый 15.04.2012, 01:57
Аватар для Mirror13
Новичок на форуме
Отправить личное сообщение для Mirror13 Посмотреть профиль Найти все сообщения от Mirror13
 
Регистрация: 14.04.2012
Сообщений: 9

Да, действительно. Если убрать наследование от div'а, все заработает:
var View = function()
{
}

View.prototype = {};
View.prototype.parent = null;
View.prototype.constructor = View;


В этом случае будет правильный this, а id будет undefined.

Выходит, не получится наследовать View от элемента DOM. А ведь было бы удобно.
Ответить с цитированием
  #6 (permalink)  
Старый 15.04.2012, 02:01
Аватар для Mirror13
Новичок на форуме
Отправить личное сообщение для Mirror13 Посмотреть профиль Найти все сообщения от Mirror13
 
Регистрация: 14.04.2012
Сообщений: 9

Maxmaxmахimus,
Уже выяснили, в чем дело, спасибо )
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск