好奇心引发的一个问题,如果我有以下代码,this
而不是user
在{{show_name
调用一个属性的好处(除了简单性) 1}}方法?
var user = {
name : 'John Doe',
show_name : function(){
alert(this.name);
// OR
alert(user.name);
}
};
答案 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
,确保在更改变量名称之后,例如从user
到something
您的代码仍然可以使用。
除此之外,我想(在某些浏览器上)也可能会有一些性能提升,因为使用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
不会比使用对象变量名称带来任何好处。