ES6 - 构造函数中需要超级

时间:2016-05-10 17:12:49

标签: javascript ecmascript-6

class Overflow {}
class Stack extends Overflow {
  constructor() {
    super();
  }
}

let stack = new Stack();

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

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

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

修改:此处super()是否正在调用基础constructor AND 设置原型?似乎错了。 编辑:为什么需要super()?即使我无意调用基础构造函数。

2 个答案:

答案 0 :(得分:2)

  

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

因此,您可以在构造函数中决定 where 来调用它。这完全有效,例如:

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关系很重要,请创建一个新的基础,它将充当接口,但不会在任何地方执行任何操作,并使旧基础和类直接将其子类化。

答案 1 :(得分:1)

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

摘要

为什么需要超级?

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

但是为什么呢?

  • 允许外来物品延伸(谢谢Felix Kling)。