ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-13 20:36:19  阅读:698  来源: 互联网

标签:javascript es6-class


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有