【问题标题】:When to use this in javascript OO?何时在 javascript OO 中使用它?
【发布时间】:2010-11-11 18:49:48
【问题描述】:

在 Javascript OO 中,何时应该使用 this 关键字?

另外,如果我想从同一个类的另一个方法调用一个类的方法,我应该使用this 还是只使用函数的名称?例如,这是正确的吗?

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

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

【问题讨论】:

  • 您不能只使用bar(),因为this 在JavaScript 中从不隐含(因为它不是真正的面向对象语言。)bar() 将首先查找定义为@987654327 的变量@ 在函数this.baz 中,然后它会在函数Foo 中查找定义为bar 的变量,最后它会在全局范围内查找,如果失败则会抛出错误。
  • 学习 JavaScript 原型系统很重要,所以这是一个很好的问题。但如果我打算用 JavaScript 做一个大型的 OO 程序,我会使用 Joose.js 或 Js.Class。
  • 如果他们不同意或愚蠢地认为 S.O.否决票的定义 =\

标签: javascript oop scope


【解决方案1】:

在这种特殊情况下,最好使用自引用变量代替this,以防止函数内部出现混乱和麻烦。

function Foo()
{
   var self = this;

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

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

原因是因为javascript中的一切都是对象,所以函数内的this关键字指的是父函数。通过在特定范围内定义变量,您可以保证该变量将保持其范围。

【讨论】:

  • 你这样做是为了范围很明显。很多人使用“that”而不是“self”。
  • 请注意,这样做会消除重新绑定函数的可能性,即fooInstance.baz.call(barInstance);
  • @tj111:您说,“在您的示例中,对 this.bar() 的调用是指 Foo.baz.bar,而不是 Foo.bar”。这不是真的。如果您创建 Foo 的实例并调用 baz ,那么 baz 的上下文就是您的 Foo 实例。看看:jsbin.com/onida/edit
  • 你当然需要嵌套函数中的自引用,或者函数将在不同的上下文中调用——例如,事件处理程序和延迟调用。我尽量避免在全球范围内使用它。
【解决方案2】:

只是为了强调和同情@tj111 的先前答案,我建议您阅读this。为了更好地理解函数作用域。

【讨论】:

    【解决方案3】:

    谈到“面向对象”的 JavaScript,这里有一个很好的指南 Mark Dickinson 链接到:Private Members in JavaScript。它确实详细介绍了您现在并不真正需要的一些其他内容,但是一旦您了解了 JavaScript 的工作原理,您就会发现它与您的普通面向对象语言在诸如 this 之类的事情上完全不同。真正的意思。

    我想说,在你的情况下,你绝对应该使用this,但也许你的函数应该在你的“类”的prototype 部分中(这样可以避免每次创建新实例时重新定义函数.)

    【讨论】:

    • 我为类制作了一个简单的模板,它似乎与 Douglas Crawford 在他的文章(我链接的)中的非常相似。如果查看代码有帮助,您可以随时查看:@987654322 @(原始文件)blixt.org/js#project/js-classes(带有语法高亮)
    • “类的原型部分”是什么意思?
    • 函数有一个prototype 属性,用作使用new 关键字调用函数时创建的对象的原型。如果您设置了Foo.prototype.bar = function () {...};,那么使用new Foo() 创建的所有对象都将具有引用Foo.prototype.bar 函数的bar 属性。
    【解决方案4】:

    正确的版本是在您尝试调用该函数时不出错的版本。如果您省略 this,您将得到 ReferenceError 异常。

    【讨论】:

      【解决方案5】:

      我发现3 Ways to define a javascript class 很有帮助。

      【讨论】:

        【解决方案6】:

        在另一篇关于 JavaScript 中的“函数别名”的文章中,我通过示例详细解释了“this”在 JavaScript 中的工作原理。我想它可能对你有用。

        请查看:JavaScript function aliasing doesn't seem to work

        【讨论】:

          猜你喜欢
          • 2011-08-19
          • 1970-01-01
          • 2011-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-14
          • 1970-01-01
          • 2016-12-26
          相关资源
          最近更新 更多