为什么"这个"在ES6类中不隐含?

时间:2017-01-03 14:14:00

标签: javascript java ecmascript-6 this

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

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

class Person {
  private String myName;

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

  public void sayMyName() {
    System.out.println("My name is " + myName);
  }
}

编译器将始终引用字段myName的值,除非它在方法范围内定义了名为myName的局部变量。

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

class Person {

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

  sayMyName() {
    console.log(`My name is ${myName}`);
  }
}

这不会起作用,它会抛出Uncaught ReferenceError: myName is not defined。解决此问题的唯一方法是引入明确的this引用:

console.log(`My name is ${this.myName}`)

我理解构造函数中需要this,因为ES6类不允许在构造函数之外定义字段,但我不明白为什么Javascript引擎可以&#39 ; t(或因为标准而获胜)与sayMyName

中的Java编译器相同

1 个答案:

答案 0 :(得分:7)

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

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

要阅读有关JS中课程的更多信息,请点击herehere

为什么你需要显式写this是因为在JS中它始终是上下文敏感的,所以你应该引用确切的对象。阅读more