Javascript 我应该从对象的实现中引用对象变量的名称吗?

Javascript 我应该从对象的实现中引用对象变量的名称吗?,javascript,this,object-literal,Javascript,This,Object Literal,将属性值设置为以下值之间是否有任何区别: var obj = { getData: function () { this.age = 34 //notice this } } obj.getData(); alert(obj.age) //34 vs 我应该在什么时候使用它们?我强烈建议使用前者,尽管两者都在这些有限的环境中工作 在可能的情况下,一个对象不应该用它在声明中给出的名称来引用它自己 使用此选项可以确保,如果为对象分配了另一个别名,并

将属性值设置为以下值之间是否有任何区别:

var obj = {
    getData: function ()
    {
        this.age = 34      //notice this
    }
}
obj.getData();
alert(obj.age) //34
vs


我应该在什么时候使用它们?

我强烈建议使用前者,尽管两者都在这些有限的环境中工作

在可能的情况下,一个对象不应该用它在声明中给出的名称来引用它自己

使用此选项可以确保,如果为对象分配了另一个别名,并且重新使用了obj,则该对象仍然正确地引用自身。同样,如果您决定重命名obj,您只需更改一次。

执行此操作:

getData: function ()
{
    this.age = 34      //notice this
}
具有以下优点:

如果您需要将obj重命名为其他对象,那么您的函数不必更改,因为它们引用的对象是这样的

它更便于携带;如果您在其他地方、其他对象中需要相同的功能,则复制/粘贴会更容易

关于单击处理程序

话虽如此,在单击处理程序中使用代码时必须小心。例如:

var obj = {
    value: 'hello world',
    doSomething: function ()
    {
        alert(this.value);
    }
}

// find first <div> on the page and attach click handler
var firstDiv = document.getElementsByTagName('div')[0];
firstDiv.addEventListener('click', obj.doSomething, false);

他们中有人给出了错误的结果吗?我们应该如何决定哪一个是正确的?要么有效,要么正确。编写目标代码以使其依赖于特定的名称对我来说似乎是不可取的。是什么让你认为有一种错误的方法?试试这个:var foo=obj;obj=5;foo.getData;告诉我你的哪些方法仍然有效;OT:将某物设置为getX的命名函数令人困惑。+1,但我不会称之为正确的,而是更好的或类似的东西。var foo=obj;obj=5;foo.getData;foo指的是obj。obj设置为5。所以foo.getData应该失败。为什么它没有失败?@RoyiNamir至少在Chrome中是这样,似乎你不能向一个基本变量添加属性。@gdoron我倾向于不同意。Felix示例清楚地表明,如果您…[…]它可能崩溃。所以我们可以避免它。这意味着这是正确的方法。@RoyiNamir我不知道你在做什么,但对我来说,如果我指定var foo=5,然后foo.age=35,那么foo.age就不会被创建。第二个例子中的Chrome和Firefox-1也是如此。我认为,伪造一个函数引用是个坏主意,这样当你去除了它的上下文时它就可以这样工作了。我记不起有多少次当人们错误地期望这样的函数工作时,我回答了问题。@Alnitak这只是一个例子,它的行为已经解释过了。我不明白这怎么会导致否决票。因为这是一个糟糕的例子和糟糕的做法,会让读者感到困惑。@Alnitak好吧,fwiw,我已经在代码中添加了必要的警告。我已经删除了我的否决票。不过,我仍然认为,如果没有这个例子,你的回答会更有力。Noob读者需要理解,裸函数引用会丢失其上下文。
var obj = {
    value: 'hello world',
    doSomething: function ()
    {
        alert(this.value);
    }
}

// find first <div> on the page and attach click handler
var firstDiv = document.getElementsByTagName('div')[0];
firstDiv.addEventListener('click', obj.doSomething, false);
firstDiv.addEventListener('click', function() {
    obj.doSomething();
}, false);