Показать сообщение отдельно
  #2 (permalink)  
Старый 14.05.2008, 12:40
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Hawk, level попадает в глобальную область видимости (становится свойством объекта window), поскольку объявлена внутри функции без var. Таким образом, при создании первого объекта (а1), level ссылается на but1, при создании второго (а2), level "перезатирается" объектом but2. В функции ButGetClick анализируется эта переменная (level), которая имеет последнее присвоенное значение (т.е. значение ссылки this второго объекта).

Не понятно, зачем вообще нужен этот level? this внутри ButGetClick будет ссылаться не на объект "класса" button, а на созданную кнопку (поскольку есть присваивание this.buttonGet.onclick = this.ButGetClick;. Подробней о работе this можно почитать здесь - http://javascript.ru/tutorial/object/thiskeyword)

Поэтому можно, либо 1) поместить el в this.buttonGet:

this.buttonGet.el = el;


И тогда в ButGetClick:

алерт(this.el);


- либо 2) создать замыкание (подробней - здесь - http://javascript.ru/tutorial/basic/closure):

this.el = el;
var thisObj = this;
this.buttonGet.onclick = function() {
  alert(thisObj.el);
};


но тогда для каждого нового объекта будет создана своя функция, а это совсем не оптимально (так что, подобного способа лучше избегать - если семантика метода одинаковая, его нужно выносить в прототип, поэтому больше подойдет первый способ)

- либо 3) - заbind'ить метод на нужный this (посмотреть пример можно, например, в библиотеке Prototype.js), но и здесь будет создана новая функция.

Поэтому наиболее оптимальным способом (по использованию памяти) будет первый, однако, может быть путаница с this.
__________________
Тонкости ECMAScript
Ответить с цитированием