2012-02-22 46 views
1

我创建了一个对象,并且当我有一个对象实例时它工作得很好。这不是实际的对象,但概念是相同的。Javascript:如何从事件处理程序中获取对象的正确实例,当它们是对象的多个实例时

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,我得到的对象实例ObjTwothis.Name设置为Steve

有没有人知道如何在onclick事件从各种实例触发时获得正确的对象实例?我假设我需要绑定与call正确的实例,但我不确定如何。

在此先感谢,希望这不是让人困惑。

回答

2

的问题是这一行:

that = this; 

你宣布that不使用var,这意味着它是全球,即所有实例都更新相同的全局变量that。取而代之:

var that = this; 

然后that将在每个地方。 (也就是说,当地的的createElement函数的每个封闭。)

演示:http://jsfiddle.net/SEsLJ/

此外,document.getElementsByNamedocument.getElementsByTagName(假设你实际上并没有给身体name属性等于“身体”) 。

+0

非常感谢,这样做! getElementsByName错误只是一个错字。 – GMihovics 2012-02-22 05:01:03