编程语言
首页 > 编程语言> > ES6 javascript类继承,为什么我们需要从派生类调用super()

ES6 javascript类继承,为什么我们需要从派生类调用super()

作者:互联网

javascript ES6中,在继承中,
如果派生类具有构造函数,为什么必须从派生构造函数调用super?

失败的例子很少-

.以构造函数为基础,但派生未​​调用super-

 class Base{constructor(){}}
    class Derived{constructor(){}}
    var d = new Derived(); // fails - ReferenceError: this is not defined

解决方法:

…it seems it is mandatory to have constructor function in base class.

并不是的.如果不提供,则为one will be provided for you by the JavaScript engine.因此,总会有一个(在这种意义上是强制性的),但不必显式编码.

当您根本不定义构造函数时,JavaScript引擎为基类提供的默认构造函数将如下所示:

constructor( ) { }

…并且派生类中的默认类将如下所示:

constructor(...args) {
    super(...args);
}

您的示例失败的原因是Derived具有显式构造函数,但该构造函数未调用super.如果您明确定义一个,则必须在Derived的构造函数中调用super.

if derived class has constructor, why it is mandatory to call super from derived constructor ?

因为您需要让超类有机会对新对象进行任何初始化.否则,超类不能保证它将正常工作,因为它可能依赖于其构造函数完成的初始化.

所以:

>从Derived中删除构造函数,使其类似于第一个示例,以便JavaScript引擎将提供默认构造函数,或者
>从Derived的构造函数调用super.

在评论中,您询问:

but if base class does not have any constructor it still fails, if a derived class has

基类始终具有构造函数,因为如果您不提供构造函数(您在问题代码中已提供),则会提供默认值.因此,您仍然必须调用它.如果所有超类都没有非默认构造函数,则可以将其指定为可选的,但这会增加复杂性并使Derived的显式构造函数产生误导性(不调用super).

还有一些机械上的原因:在您调用super之前,这是没有定义的,但是您可以在调用super之前做一些事情,因此进行调用对于处理规范中的机制是必要的.

标签:javascript,es6-class
来源: https://codeday.me/bug/20191013/1910296.html