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

When do I need to call `super` from a constructor?

阅读 Dr. Axel Rauschmayer's blog on ES6 classes,我了解到派生的 class 在提供 none 时具有以下默认构造函数

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 的条件)

对于派生的 classes,我只需要在...

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

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

是的,听起来是对的,尽管表述有点奇怪。规则应该是

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

1:您不需要在显式 returning 一个对象的可疑边缘情况下调用它,您几乎不会这样做。

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

  • 你想在子类构造函数中引用this
  • 您没有return子类构造函数中的不同对象

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

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 时,我不明白参数的顺序有何影响。