何时在JavaScript面向对象编程中使用它?

8
在Javascript面向对象编程中,何时应该使用this关键字?
此外,如果我想从同一类的另一个方法调用类的方法,我应该使用this还是只使用函数的名称?例如,这样做是否正确?
function Foo()
{
   this.bar= function()
   {
      alert('bar');
   }

   this.baz= function()
   {
     this.bar(); //should I use this.bar() or just bar()?
   }
}

1
你不能仅使用 bar(),因为在 JavaScript 中 this 从来不是隐式的(因为它不是真正的面向对象语言)。bar() 首先会在函数 this.baz 中查找定义为 bar 的变量,然后会在函数 Foo 中查找定义为 bar 的变量,最后会在全局范围内查找,如果还是找不到就会抛出错误。 - Blixt
1
学习JavaScript原型系统非常重要,因此这是一个很好的问题。但是,如果我要在JavaScript中编写大型面向对象程序,我会使用Joose.js或Js.Class。 - Nosredna
有一些踩票恶魔会在不同意或认为某些东西很傻的情况下投反对票,这完全违背了 S.O. 对踩票的定义。=\ - Fabiano Soriani
6个回答

6
当涉及到“面向对象”的JavaScript时,这里有一篇很好的指南,Mark Dickinson在SO上链接了:JavaScript中的私有成员。它确实详细介绍了一些你现在不需要的其他内容,但是一旦你理解了JavaScript的工作原理,你会发现它在像this真正意味着什么这样的事情上与普通的面向对象语言非常不同。
我认为在你的情况下,你应该绝对使用this,但也许你的函数应该在你的“类”的prototype部分中(这避免了每次创建新实例时重新定义函数)。

我为类制作了一个简单的模板,它似乎与Douglas Crawford在他的文章中所使用的非常相似(我提供了链接)。如果需要帮助,请查看代码:http://blixt.org/js/classes.js(原始文件)http://blixt.org/js#project/js-classes(带有语法高亮) - Blixt
1
“prototype part of the class” 是什么意思? - Ali
1
函数具有一个名为prototype的属性,该属性用作使用new关键字调用函数时创建的对象的原型。如果您设置了Foo.prototype.bar = function() {...};,那么使用new Foo()创建的所有对象都将具有引用Foo.prototype.bar函数的bar属性。 - Blixt

1

0
在这种情况下,最好使用自引用变量来代替this,以防止函数内部的混淆和头痛。
function Foo()
{
   var self = this;

   this.bar= function()
   {
      alert('bar');
   }

   this.baz= function()
   {
     self.bar();
   }
}

这是因为在JavaScript中,一切都是对象,函数内的this关键字指向父函数。通过在特定作用域定义变量,可以确保该变量将保持其作用域。


你需要这样做,以便范围明确。很多人使用“that”而不是“self”。 - Nosredna
2
请注意,这样做会取消重新绑定函数的可能性,即fooInstance.baz.call(barInstance); - Blixt
@tj111:你说,“在你的例子中,对this.bar()的调用是指Foo.baz.bar,而不是Foo.bar”。这是不正确的。如果你创建一个Foo实例并调用baz,那么baz的上下文就是你的Foo实例。看看这个链接:http://jsbin.com/onida/edit - Prestaul
在嵌套函数或函数将在不同上下文中调用的情况下 - 例如事件处理程序和延迟调用中,您肯定需要自我引用。但是,我尽量避免在全局范围内使用它。 - glenatron

0

强调并同情@tj111之前的答案,我建议您阅读this。以更好地理解函数作用域。


0

正确的版本是在尝试调用函数时不会出现错误的版本。如果省略this,则会出现ReferenceError异常。


0
在另一篇关于JavaScript中'函数别名'的帖子中,我详细解释了JavaScript中'this'的工作原理,并提供了示例。我认为这可能对您有所帮助。
请查看:JavaScript函数别名似乎不起作用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接