Javascript';这';对对象名

Javascript';这';对对象名,javascript,object,this,Javascript,Object,This,好奇引发的一个问题,如果我有以下代码,那么通过this而不是show\u name方法中的user调用属性有什么好处(不仅仅是简单) var user = { name : 'John Doe', show_name : function(){ alert(this.name); // OR alert(user.name); } }; 通过使用此可以确保在将变量名称(例如从用户更改为某个东西后,您的代码仍然有效

好奇引发的一个问题,如果我有以下代码,那么通过
this
而不是
show\u name
方法中的
user
调用属性有什么好处(不仅仅是简单)

var user = {

    name : 'John Doe',

    show_name : function(){

        alert(this.name);

        // OR

        alert(user.name);
    }
};

通过使用
可以确保在将变量名称(例如从
用户
更改为
某个东西
后,您的代码仍然有效

除此之外,我认为(在某些浏览器上)可能也会有一些性能提升,因为使用
user.name
浏览器时,必须在功能之外的上下文中查找,而使用
this.name
则坚持当前上下文


示例代码

var用户={
姓名:“约翰·多伊”,
show_name:function(){
警报(用户名);
}
};
var something=user;//将对象传递给另一个变量
user=null;//使用户变量指向其他变量
某物。显示_name();
如果运行上述代码,将在以下行中遇到错误:


alert(user.name);// 您可以在多个位置使用同一函数,并使其与上下文相关

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

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

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

如果您查看此示例,差异将变得明显。它创建第二个对象并相应地设置原型

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
属性。

此处指定对象是当前名称空间的一部分,可以在对象内部访问。。假设您的对象名称从
user
更改为
newUser
,将不存在任何依赖关系并消除任何耦合问题。

您是使用
还是函数名称取决于函数的调用方式

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

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

var x = user.showName;
x();
在上面的例子中,调用showName时没有设置它的
this
,因此它默认为全局对象,函数中的
this.name
可能不是预期的

鉴于文本编辑器中具有相当强大的搜索和替换功能,更改函数名并不是一个特别繁重的问题


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

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

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”和“user”如何确保我们可以将“name”更改为“something”。你不是说我们可以把“user”改成“something”吗?@Jacob-很好-当然我是说写
user
而不是
name
。注意,使用
这个
user.show_name.call(null)可能还有其他副作用问题是使用
this
而不是
user
的好处是什么……它并不是在寻找相反的情况。@Quentin。你是对的。但是我发现这个问题仅仅是从这个角度来看的,成千上万的人也是如此。你发现了一个错误的问题。你要找的人是你现在不对。我已经阅读了这个问题的答案,并决定使用“this”的好处是微妙的,在我的特殊情况下,没有它我会更好。