【问题标题】:Javascript/NodeJS: Invoking object methods inside the same object: why is "this." mandatory?Javascript/NodeJS:在同一个对象内调用对象方法:为什么是“this”。强制的?
【发布时间】:2023-03-31 02:09:01
【问题描述】:

我是 Node/Javascript (ES6) 的新手。 请参阅下面的示例:

class MyClass {

    myTest() {
          console.log('it works')
        }

    runMyTest() {
          this.myTest()
        }

}

如果我在 this.myTest() 行中省略了 this.,我会收到运行时错误:

      myTest()
      ^

ReferenceError: myTest 未定义

在我看来,调用调用者的同一对象(在这种情况下为类对象)中声明的方法是强制性的,需要 this.method()

对吗?

以类似的方式,我看到(子类对象的)父方法需要 super.parentMethod()。

来自 Ruby/其他对我来说听起来很奇怪的 OO 语言。

为什么在 JS 中强制 this. / super. 的原因?


更新:

我发现的小解决方法(以避免 this.method 重复):

class MyClass {

    myTest() {
          console.log('it works')
        }

    runMyTestManyTimes() {
          const mytest = this.mytest

          myTest()
          ...
          myTest()
          ...
          myTest()
          ...

        }

}

【问题讨论】:

  • 最直接的答案是因为这正是语言规范所要求的。 this 是调用上下文,而省略this 只会从作用域中查找标识符,如果它在作用域内,则在没有调用上下文的情况下调用函数,在这种情况下它不是。
  • 我不了解 Ruby(除了用于编辑的基础知识,例如 Vagrantfiles),但 Java 和 Python 都以这种方式工作。我以为 Ruby 用@ 代替this。它真的可以让你调用没有引用的方法吗?

标签: javascript node.js function oop scope


【解决方案1】:

因为this 指的是MyClass 的实例(带有原型上的类方法)并且没有它,您的方法不会看到该函数,因为它没有正确查找地方。它将使用其范围内的任何内容,即如果函数 myTest() 在全局类之外声明。

【讨论】:

  • 是的,我正要更新它。它引用该实例并具有类方法的原型编辑:已更新,如果我错了,任何人都可以纠正我,谢谢
【解决方案2】:

这是因为与 Java 或 C#(您很可能从那里看到这种做法)不同,JavaScript 可以具有不属于该类的函数。

在这种情况下你会怎么做?

class MyClass {
  myTest() {
    console.log('it works');
  }

  runMyTest() {
    myTest(); // oops
  }
}

function myTest() {
  console.error('It does not work! Oh my god everything is on fire!');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 2011-08-03
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多