【问题标题】:When do I need to call `super` from a constructor?我什么时候需要从构造函数中调用 `super`?
【发布时间】:2016-12-27 19:16:34
【问题描述】:

阅读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. 我需要在构造函数中访问this
  2. 超类构造函数与派生类构造函数需要不同的参数

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

【问题讨论】:

  • 不,没有。你想为那个陈述提供什么样的“证据”?
  • 当你创建一个像class ABC extends DEF { ... 这样的类时,你必须输入super(...args);,因为你刚刚用extends DEF 声明你想从它派生。如果你不是从任何类派生的,那么就不要在 ABC 的构造函数中放入“super”。就是这么简单。
  • @Azamantes:如果父类采用与子类相同的参数,则无需调用super
  • 如果派生类确实定义了构造函数怎么办?然后我需要包括对超级的明确调用吗?换句话说,对 super 的默认调用是否仅作​​为默认构造函数的一部分包含在内? (不确定这里的用例,只是想考虑边缘情况)
  • @sfletche 是的,所有构造函数都没有“默认super调用”,它只是默认构造函数的一部分。

标签: javascript ecmascript-6 es6-class


【解决方案1】:

是的,这听起来是对的,尽管表述方式有些奇怪。规则应该是

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

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

【讨论】:

    【解决方案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 时,我看不出参数的顺序有什么影响。

    【讨论】:

    • 当我想在子类的任何地方引用this 时?或者只是子类构造函数中的任何地方?
    • @sfletche 是的,他的意思是构造函数
    • @sfletche 类中的其他东西只是方法,我的意思是构造函数,是的。
    猜你喜欢
    • 2015-01-27
    • 2019-11-17
    • 2019-03-01
    • 2022-01-19
    • 2022-01-15
    • 2011-03-30
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多