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