是否可以在 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)类的规则基本上归结为:
- 在子类构造函数中,
this
在调用super
之前不能使用。 - 如果它们是子类,ES6 类构造函数必须调用
super
,否则它们必须显式返回某个对象来代替未初始化的对象。
这归结为 ES2015 规范的两个重要部分。
部分 8.1.1.3.4定义逻辑来决定函数中的 this
是什么。类的重要部分是 this
可能处于 "uninitialized"
状态,并且当处于这种状态时,尝试使用 this
会抛出异常。
部分 9.2.2 , [[Construct]]
,它定义了通过 new
或 super
调用的函数的行为。调用基类构造函数时,this
在 [[Construct]]
的第 8 步初始化,但对于所有其他情况,this
是未初始化。在构造结束时,调用 GetThisBinding
,因此如果还没有调用 super
(因此初始化 this
),或者显式替换对象没有返回,构造函数调用的最后一行会抛出异常。
关于javascript - 如何在 ES6 中无需使用 super 来扩展类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31067368/