我什么时候需要从构造函数中调用 `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
- 我需要从构造函数中访问
this
- 超级class构造函数需要与派生class构造函数
不同的参数
还有其他时候我应该包含对 superclass 构造函数的调用吗?
是的,听起来是对的,尽管表述有点奇怪。规则应该是
- 在派生的class中,你总是1需要调用
super(…)
构造函数
- 如果你不做多于默认构造函数,可以省略整个
constructor(){}
,
这反过来会使您的 class 代码不包含超级调用。
1:您不需要在显式 return
ing 一个对象的可疑边缘情况下调用它,您几乎不会这样做。
在这些情况下,您需要在子类构造函数中调用 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
时,我不明白参数的顺序有何影响。
阅读 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
- 我需要从构造函数中访问
this
- 超级class构造函数需要与派生class构造函数 不同的参数
还有其他时候我应该包含对 superclass 构造函数的调用吗?
是的,听起来是对的,尽管表述有点奇怪。规则应该是
- 在派生的class中,你总是1需要调用
super(…)
构造函数 - 如果你不做多于默认构造函数,可以省略整个
constructor(){}
, 这反过来会使您的 class 代码不包含超级调用。
1:您不需要在显式 return
ing 一个对象的可疑边缘情况下调用它,您几乎不会这样做。
在这些情况下,您需要在子类构造函数中调用 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
时,我不明白参数的顺序有何影响。