为什么ES6类中的"this"不是隐含的?

Rob*_*die 9 javascript java this ecmascript-6

我知道ES6解决了thisES5中关键字存在的许多问题,例如箭头函数和类.

我的问题涉及this在ES6类的上下文中的使用以及为什么必须明确地编写它.我最初是一名Java开发人员,我来自一个以下几行代码非常自然的世界.

class Person {
  private String myName;

  public Person() { 
    myName = "Heisenberg";
  }

  public void sayMyName() {
    System.out.println("My name is " + myName);
  }
}
Run Code Online (Sandbox Code Playgroud)

编译器将始终引用该字段的值myName,除非它具有myName在方法范围内定义的名称的局部变量.

但是,一旦我们将此代码转换为ES6:

class Person {

  constructor() {
    this.myName = "Heisenberg";
  }

  sayMyName() {
    console.log(`My name is ${myName}`);
  }
}
Run Code Online (Sandbox Code Playgroud)

这将无法正常工作,它会抛出一个Uncaught ReferenceError: myName is not defined.解决这个问题的唯一方法是抛出一个明确的this引用:

console.log(`My name is ${this.myName}`)
Run Code Online (Sandbox Code Playgroud)

我理解this在构造函数中需要,因为ES6类不允许在构造函数之外定义你的字段,但我不明白为什么Javascript引擎不能(或不会,因为标准)做与Java编译器一样可以sayMyName

mar*_*kin 7

也许我不会直接回答你的问题,但我会尝试指导你应该考虑JS class关键字的方式.

在封面下,没有任何魔力.从JavaScript开始以来,它基本上是原型继承的合成糖.

要阅读JS中有关类的更多信息,请单击此处此处.

至于你需要显式写的原因this是因为在JS中它始终是上下文敏感的,所以你应该引用确切的对象.阅读更多.