一尘不染

如何扩展类而不必在ES6中使用super?

javascript

是否可以在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运行它


阅读 271

收藏
2020-05-01

共1个答案

一尘不染

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

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

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

8.1.1.3.4节定义了决定this功能的逻辑。类的重要部分是有可能this处于一种"uninitialized"状态,当处于这种状态时,尝试使用this将引发异常。

节9.2.2,[[Construct]],它定义的通过被称为功能的行为newsuper。调用基类构造函数时,this在的步骤#8进行了初始化[[Construct]],但对于所有其他情况,this都未初始化。在构造结束时,GetThisBinding将调用,因此,如果super尚未调用(因此初始化this),或者未返回显式替换对象,则构造函数调用的最后一行将引发异常。

2020-05-01