javascript - 如何在 ES6 中无需使用 super 来扩展类?

标签 javascript class inheritance ecmascript-6

是否可以在 ES6 中扩展一个类而不调用 super 方法来调用父类?

编辑:这个问题可能具有误导性。这是我们必须调用 super() 的标准还是我错过了什么?

例如:

class Character {
   constructor(){
      console.log('invoke character');
   }
}

class Hero extends Character{
  constructor(){
      super(); // exception thrown here when not called
      console.log('invoke hero');
  }
}

var hero = new Hero();

当我不在派生类上调用 super() 时,我遇到了范围问题 -> this is not defined

我在 v2.3.0 中使用 iojs --harmony 运行它

最佳答案

ES2015(ES6)类的规则基本上归结为:

  1. 在子类构造函数中,this 在调用 super 之前不能使用。
  2. 如果它们是子类,ES6 类构造函数必须调用 super,否则它们必须显式返回某个对象来代替未初始化的对象。

这归结为 ES2015 规范的两个重要部分。

部分 8.1.1.3.4定义逻辑来决定函数中的 this 是什么。类的重要部分是 this 可能处于 "uninitialized" 状态,并且当处于这种状态时,尝试使用 this 会抛出异常。

部分 9.2.2 , [[Construct]],它定义了通过 newsuper 调用的函数的行为。调用基类构造函数时,this[[Construct]] 的第 8 步初始化,但对于所有其他情况,this 是未初始化。在构造结束时,调用 GetThisBinding,因此如果还没有调用 super(因此初始化 this),或者显式替换对象没有返回,构造函数调用的最后一行会抛出异常。

关于javascript - 如何在 ES6 中无需使用 super 来扩展类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31067368/

相关文章:

Java-如何使用抽象类

c# - 使用共享词典是解决缺少 "extension properties"的好方法吗?

Javascript 库无需在脚本标签中使用导入

javascript - 选择选项的自定义属性并从 Angular 5 中的 AbstractControl 访问它?

java - ActionPerformed 方法不适用于另一个类

相互依赖的类的 C++ 继承

Javascript 继承调用父级的非默认构造函数

javascript - 使用http-server的Angular js1基本应用程序不进入 Controller

javascript - 使用 setTimeout 延迟 ng-hide 执行

java - java中子类调用子类