gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:40:25 24 4
gpt4 key购买 nike

在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 有一个显式的 constructor,但是 constructor 没有调用 super。如果您显式定义一个构造函数,则必须Derived 的构造函数中调用super

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

因为你需要给父类(super class)一个机会来对它必须做的新对象进行任何初始化。否则,父类(super class)不能保证它会正确工作,因为它可能依赖于其构造函数完成的初始化。

所以要么:

  1. Derived 中删除您的constructor,使其与您的第一个示例相似,以便 JavaScript 引擎将提供默认构造函数,或者

    <
  2. Derived 的构造函数调用 super

在您提出的评论中:

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

基类总是 有一个构造函数,因为如果您不提供构造函数(您在问题的代码中提供),则会提供一个默认值。所以你还是要调用它。如果没有一个父类(super class)具有非默认构造函数,它可以被指定为可选的,但这会增加复杂性并使 Derived 的显式构造函数产生误导(不调用到 super)。

还有一些机械方面的原因:this 直到你调用 super 才定义,但你可以在调用 super< 之前做一些事情,因此进行调用对于处理规范中 this 的机制是必要的。

关于javascript - ES6 javascript 类继承,为什么我们需要从派生类调用 super(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41381489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com