我什么时候需要从构造函数中调用`super`?

sfl*_*che 3 javascript ecmascript-6 es6-class

阅读Axel Rauschmayer博士关于ES6课程的博客,我知道派生类在没有提供时会有以下默认构造函数

constructor(...args) {
    super(...args);
}
Run Code Online (Sandbox Code Playgroud)

我也明白,如果我想this在构造函数中使用我首先需要调用super,否则this将不会被初始化(抛出一个ReferenceError).

constructor(width, height) {
    this.width = width;  // ReferenceError
    super(width, height);
    this.height = height; // no error thrown
    ...
}
Run Code Online (Sandbox Code Playgroud)

以下假设是否正确?(如果没有,请你解释一下我应该明确打电话的条件super)

对于派生类,我只需要super在...时显式调用

  1. 我需要this从构造函数中访问
  2. 超类构造函数需要与派生类构造函数不同的参数

还有其他时候我应该包含对超类构造函数的调用吗?

Ber*_*rgi 6

是的,这听起来是正确的,虽然有点奇怪的表述.规则应该是

  • 在派生类中,你总是1需要调用super(…)构造函数
  • 如果你没有做超过默认构造函数,你可以省略整体constructor(){},这反过来会使你的类代码不包含超级调用.

1:你不需要在明确return对象的可疑边缘情况下调用它,这是你几乎不会想到的.