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

时间:2016-12-27 19:16:35

标签: javascript ecmascript-6 es6-class

阅读Dr. Axel Rauschmayer's blog on ES6 classes,我知道派生类在没有提供时会有以下默认构造函数

constructor(...args) {
    super(...args);
}

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

constructor(width, height) {
    this.width = width;  // ReferenceError
    super(width, height);
    this.height = height; // no error thrown
    ...
}

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

对于派生类,我只需要在......

时显式调用super
  1. 我需要从构造函数
  2. 中访问this
  3. 超类构造函数需要与派生类构造函数
  4. 不同的参数

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

2 个答案:

答案 0 :(得分:6)

是的,这听起来很正确,虽然有点奇怪。规则应该是

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

1:你不需要在明确return一个物体的可疑边缘情况下调用它,你几乎不会这样做。

答案 1 :(得分:2)

在这些情况下,您需要在子类构造函数中调用super

  • 您想在子类构造函数
  • 中引用this
  • 您不在子类构造函数
  • 中返回其他对象

在其他情况下,如果您希望运行超类构造函数,则可以调用它,但您不必这样做。

class SuperClass{
  constructor() {
    console.log('SuperClass');
  }
}
class SubClass1 extends SuperClass {
  constructor() {
    console.log('SubClass1');
    super();
    return {};
  }
}
class SubClass2 extends SuperClass {
  constructor() {
    console.log('SubClass2');
    return {};
  }
}
new SubClass1();
new SubClass2();

在决定是否应该拨打super时,我看不出参数顺序如何重要。