【问题标题】:Why is "this" in an ES6 class not implicit?为什么 ES6 类中的“this”不是隐含的?
【发布时间】:2017-01-03 14:13:59
【问题描述】:

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

我的问题与 this 在 ES6 类的上下文中的用法有关,以及为什么必须显式编写它。我最初是一名 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 引擎不能(或不会,因为标准)在sayMyName的情况下,Java编译器可以做同样的事情

【问题讨论】:

  • 所以你基本上是在问为什么两种完全不同的语言表现不同?注意“javascript”中的“java”与Java编程语言无关。
  • @luk2302 - 如果你说语言基本上没有关系,那是真的。但是当你说“'javascript' 中的'java' 与编程语言 Java 无关”时,这是错误的,因为你可以通过快速的谷歌搜索来验证。来自维基百科:“...在收到 Sun 的商标许可后,采用了 JavaScript 这个名称。这在当时是一种营销举措,当时 Java 非常流行"
  • 您不仅要比较不同的语言,还要比较不同的概念。 “我明白在构造函数中需要这个” 为什么要对构造函数进行不同的处理?
  • 这会使语言不一致且更复杂,因为现在我们需要一些其他结构来引用外部范围(而不是成员)中的变量。但是,关于语言设计决策的问题通常不适合 SO。您可能想改用esdiscuss.org 询问。
  • @FelixKling 我想您的评论比当前的评论更好,如果您发布答案我会很乐意接受它

标签: javascript java ecmascript-6 this


【解决方案1】:

也许我不会直接回答你的问题,但我会尝试指导你应该如何看待 JS class 关键字。

在封面之下并没有什么魔力。基本上它是自 JavaScript 开始以来原型继承的语法糖。

要了解更多关于 JS 中的类的信息,请点击 herehere

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多