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

时间:2013-02-04 16:11:10

标签: javascript this object-literal

(设置属性值)与:

之间是否有任何区别?
var obj = {
    getData: function ()
    {
        this.age = 34      //notice this
    }
}
obj.getData();
alert(obj.age) //34

VS

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

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

2 个答案:

答案 0 :(得分:6)

前者是(恕我直言)强烈偏好,尽管两者都是"工作"在这些有限的情况下。

只要有可能,对象就不应该通过其声明中给出的名称来引用自己。

使用this可确保在为对象分配另一个别名并重新使用obj时,该对象仍然正确引用自身。同样,如果您决定重命名obj - 您只需更改一次。

答案 1 :(得分:1)

这样做:

getData: function ()
{
    this.age = 34      //notice this
}

具有以下优点:

  1. 如果您需要将obj重命名为其他内容,则您的功能无需更改,因为它们将对象称为this

  2. 它更便携;如果您在其他地方需要相同的功能,则可以更容易地复制/粘贴。

  3. 关于点击处理程序

    话虽如此,当你的代码被用于点击处理程序时,必须小心。例如:

    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);
    

    点击<div>后,它会调用obj.doSomething,但this现在引用window对象,这是意外的,您的代码会提醒“未定义”。

    要修复它,您需要编写辅助函数:

    firstDiv.addEventListener('click', function() {
        obj.doSomething();
    }, false);