Javascript'this'vs对象名称

时间:2012-10-09 12:08:41

标签: javascript object this

好奇心引发的一个问题,如果我有以下代码,this而不是user在{{show_name调用一个属性的好处(除了简单性) 1}}方法?

var user = {

    name : 'John Doe',

    show_name : function(){

        alert(this.name);

        // OR

        alert(user.name);
    }
};

7 个答案:

答案 0 :(得分:11)

如果您看一下这个例子,差异就变得很明显了。它会创建第二个对象并相应地设置原型。

var user = {

    name : 'John Doe',

    show_name : function(){

        alert(this.name);

        // OR

        alert(user.name);
    }
};

user2 = Object.create( user );
user2.name = "someone else";

user2.show_name();

此处this.name引用当前对象的name属性,而user.name始终引用原始name属性。

答案 1 :(得分:6)

使用this,确保在更改变量名称之后,例如从usersomething您的代码仍然可以使用。

除此之外,我想(在某些浏览器上)也可能会有一些性能提升,因为使用user.name浏览器必须在函数外部查找,同时使用this.name坚持当前上下文

答案 2 :(得分:4)

您可以在多个位置使用相同的功能,并使其与上下文相关。

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

var a = { alert: foo, name: "A" };
var b = { alert: foo, name: "B" };
a.alert();
b.alert();

答案 3 :(得分:2)

是否使用this或函数名称取决于函数的调用方式。

函数的this值由函数的调用方式或 bind 设置,因此如果函数将始终作为合适对象的方法调用,请使用{{1 }}。但是,如果它可能以任何其他方式调用,或者this只应引用特定对象,则使用 bind 或对象名称。

e.g。给出OP示例,请考虑:

this

在上文中,调用var x = user.showName; x(); 时未设置其showName,因此它默认为全局对象,函数中的this可能不是预期的。

考虑到文本编辑器中相当强大的搜索和替换功能的可用性,更改功能名称并不是一个特别繁重的问题。

顺便提一下,经常会问这个问题。没有“正确”的答案,只有在某些情况下如何做出选择的建议。

答案 4 :(得分:0)

如果您要制作对象的多个副本,则需要this,以便您可以引用当前的对象。使用该名称将引用默认对象,而不是您正在使用的副本。

答案 5 :(得分:0)

this此处指定对象是当前名称空间的一部分,并且可以在对象内部访问..假设您的对象名称从user更改为newUser,则不会任何依赖并删除任何耦合问题..

答案 6 :(得分:-1)

在使用jQuery的情况下,this引用jQuery对象。因此,我的选择是根本不使用this

var user = {

name : 'John Doe',

alertName : function(){

    //  alert(this.name); //never

     alert(user.name);
  }
};
showName : function(){
    $('#show').click(function(){
        //this here references jQuery object 
        $('#username').val(user.name);
    });

};

此外,通常不应该使用对象文字来创建多个对象,因此,在对象文字内使用this不会比使用对象变量名称带来任何好处。