按此对象名称访问属性?

时间:2012-01-30 23:57:39

标签: javascript

拿这段代码:

var obj = {
  init: function(){
    console.log(obj.count);
    //or 
    console.log(this.count);
  },
  count: 1,
  msg: 'hello'
}

obj.init();

我可以通过this或变量名obj来访问obj的属性。使用 this 有什么好处吗?因为在我看来,使用对象名称obj会增加代码的清晰度。

2 个答案:

答案 0 :(得分:1)

this的优点是它允许相同的函数适用于该类型对象的多个实例。使用变量名obj的相应缺点是它只引用该特定实例。

在你的情况下,你只有一个单例对象,因为你将obj变量赋给了一个对象文字,所以不会有多个实例,但是如果你以后复制那个代码来创建另一个具有不同变量名称的类似对象,您必须查找/替换obj的所有用法并将其更改为新变量名称。

请注意,在JavaScript中,函数中this的值取决于函数的调用方式,而不是函数是否定义为对象的属性/方法。请参阅https://developer.mozilla.org/en/JavaScript/Reference/Operators/this

至于使代码可读,this是所有有经验的JS编码人员(或应该)熟悉的语言的标准部分,在我看来,它是更多可读,因为您不必回头查看obj被宣布的位置......

答案 1 :(得分:1)

如果出于某种原因你决定将init作为回调传递,那么“this”的值可能不是你所期望的那样。

例如,如果您执行类似

的操作
var count = 2;
setTimeout(obj.init, 1000);

当init被触发时,控制台将实际记录

1

2

而不是

1

1

因为init函数中“this”的值将被绑定到全局窗口对象。

根据你调用init函数的方式,这个值完全不同。

obj.init() //this is binded to obj
new obj.init() //this is binded to a COPY of obj.
setTimeout(obj.init,1000); //this is binded to the global window obj
obj.init.call(obj2); //this is binded to obj2

var foo = {};
foo.bar = obj.init;
foo.bar(); //this is binded to foo;