繁体   English   中英

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

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

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

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. 超类构造函数需要与派生类构造函数不同的参数

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

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

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

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

在这些情况下,您需要在子类构造函数中调用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与否。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM