【问题标题】:Access properties by this or object name? [duplicate]按此或对象名称访问属性? [复制]
【发布时间】:2012-01-30 23:57:38
【问题描述】:

获取此代码:

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

obj.init();

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

【问题讨论】:

  • PHP、C# 和 JavaScript 做 OOP 的方式非常不同。
  • 如果你愿意,我只需要 JavaScript
  • 不,你不是,你的第一句话问的是 PHP 和 C#...
  • “我要求使用 javascript,但如果有人有 php 或 C# 的答案,那会有所帮助。”我提到的代码来自javascript。如果您不觉得我在要求 javascript,您可以更改它并请帮助我。

标签: javascript


【解决方案1】:

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

在您的情况下,您只有一个单例对象,因为您将 obj 变量分配给对象文字,因此不会有多个实例,但是如果您稍后复制该代码以创建另一个类似的对象为该新对象使用不同的变量名,您必须查找/替换 obj 的所有用法并将它们更改为新的变量名。

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

就使代码可读性而言,this 是所有有经验的 JS 编码人员都(或应该)熟悉的语言的标准部分,并且在我看来它可读因为您不必回头查看obj 的声明位置...

【讨论】:

  • 在函数内部,this 将作为别名工作。没有任何性能提升。对吧?
  • 性能?我不知道。我怀疑你会注意到差异,但如果我不得不猜测我会说this 会更快,因为它实际上是一个局部变量,而使用obj 涉及通过周围范围进行跟踪。在您进一步处理对象之前,我建议您阅读我在答案中链接到的 MDN 页面,以获得对 this...的完整解释...
  • 感谢您的宝贵时间,对我帮助很大
  • 不客气。显然,这是一个很大的话题,可以说更多,但我试图仅提及与您询问的代码直接相关的几个关键点。编码愉快!
  • @nnnnnn-我认为速度无关紧要。在示例中,obj 位于全局对象上。似乎许多浏览器优化了全局对象查找,它们非常快,所以我怀疑你会看到与 this 的显着性能差异(正如你所说,它是一个局部变量)。 this 的一个缺点是它是由调用设置的,所以如果你调用函数的方式与预期的调用方式不同,事情就会中断(例如var b = obj.init; b())。
【解决方案2】:

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

例如,如果你做类似的事情

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

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

1

2

而不是

1

1

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

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

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;

【讨论】:

  • +1 用于指出 this 的问题,但在 new obj.init() 中,init 函数中的 this 将成为一个新对象(obj.init 被称为构造函数),而不是 obj 的“副本”。
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2010-10-19
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
相关资源
最近更新 更多