Javascript: Как получить правильный экземпляр объекта из обработчика событий, когда их несколько экземпляров объекта - PullRequest
1 голос
/ 22 февраля 2012

Я создал объект, и он прекрасно работает, когда у меня есть один экземпляр объекта.Это не фактический объект, но концепция та же.

function foo(name){
    this.name = name;
}

foo.prototype.CreateElement = function(){
    var newElement = document.createElement("a");

    that = this;

    newElement.onclick = function(){
        that.SayName(this);
    };

    document.getElementsByName("body")[0].appendChild(newElement);
}

foo.prototype.SayName = function(LinkObj){
    alert(this.name);
    LinkObj.href = "http://google.com";
}

Мне сказали, что, сохранив экземпляр this в переменной (в данном случае that), я быпо-прежнему получить ссылку на правильный экземпляр объекта для метода SayName.Это оставило бы this для представления экземпляра элемента, переданного из onclick.Кажется, что все это работает правильно только с одним экземпляром, но когда я создаю несколько экземпляров объекта, я получаю последний экземпляр, являющийся экземпляром, предоставленным в событии onclick.

Я инициализирую два объекта, как это

var ObjOne = new foo("Ted");
ObjOne.CreateElement();

var ObjTwo = new foo("Steve");
ObjTwo.CreateElement();

и когда onclick срабатывает для ObjOne, я получаю экземпляр объекта для ObjTwo, и поэтому this.Name устанавливается на Steve.

Кто-нибудьзнаете, как получить правильный экземпляр объекта, когда событие onclick запускается из разных экземпляров?Я предполагаю, что мне нужно связать правильный экземпляр с call, но я не совсем уверен, как это сделать.

Заранее спасибо и надеюсь, что это не смущает.

1 Ответ

3 голосов
/ 22 февраля 2012

Проблема в этой строке:

that = this;

Вы объявили that без использования var, что означает, что это global , т. Е. Все ваши экземпляры обновляют одну и ту же глобальную переменную that. Сделайте это вместо:

var that = this;

Тогда that будет локальным для каждого. (То есть локально для каждого замыкания функции CreateElement.)

Демо: http://jsfiddle.net/SEsLJ/

Кроме того, document.getElementsByName должно быть document.getElementsByTagName (при условии, что вы на самом деле не дали телу атрибут имени, равный "body").

...