ES6 - 构造函数中的超级必需

ES6 - Super required in constructor

本文关键字:构造函数 ES6      更新时间:2023-09-26
class Overflow {}
class Stack extends Overflow {
  constructor() {
    super();
  }
}
let stack = new Stack();

https://plnkr.co/edit/JqRfuDAav9opvapwCGpT?p=preview

如果我使用construtor()必须始终调用 super((。

为什么在构造函数中不调用super()自动?

编辑:super()在这里调用基础constructor设置原型吗?似乎不对。编辑:为什么需要super()?即使我无意调用基构造函数。

为什么在构造函数中不调用super()自动?

因此,您可以决定在构造函数中的哪个位置调用它。这是完全有效的,例如:

constructor(foo) {
    let bar;
    if (foo) {
        bar = /*...*/;
    } else {
        bar = /*...*/;
    }
    super(bar);
}

。在调用 super 之前未提供任何代码,则使用 this(或 super.xyz (。

是的,本来可以定义语言,如果你在构造函数中根本没有任何调用super,它会在开始时自动为你添加(a'la Java(,但他们只是决定不这样做。

super()在这里调用基构造函数并设置原型吗?似乎不对。

不,它调用基构造函数。原型是在调用构造函数之前设置的。就像这个旧的 ES5 代码一样:

function Derived() {
    Base.call(this);
}

。在:

function Base() {
}
function Derived() {
    Base.call(this);
}
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;

为什么需要super()?即使我无意调用基构造函数。

如果您无意调用基构造函数,那么您的子类不是子类,也不应该扩展基类。在严格类型的语言中,您可能会使基(或基的子集(成为接口,并让您的类实现它而不是子类化。在 JavaScript 中,没有必要,只要让它像你想要的鸭子一样嘎嘎叫。如果instanceof关系很重要,请创建一个新的基,它将充当接口,但不在任何地方执行任何操作,并让旧基和你的类直接子类化它。

Axel FTWhttp://www.2ality.com/2015/02/es6-classes-final.html

总结

为什么需要超级?

  • 新的关键字class不仅仅是语法糖。
  • 分配和实例化仅发生在基构造函数中。

但为什么呢?

  • 允许异国情调的物体被扩展(谢谢菲利克斯·克林(。