ReferenceError: 在派生类构造函数中必须在使用“this”之前调用super构造函数
当派生类构造函数没有为给定的派生类构造函数调用 super()
,并且派生构造函数尝试访问 this
的值,或者派生构造函数已经返回并且返回值不是对象时,就会发生 JavaScript 异常 "必须在派生类构造函数中使用 'this' 之前调用 super 构造函数"。
消息
ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor (V8-based) ReferenceError: must call super constructor before using 'this' in derived class constructor (Firefox) ReferenceError: 'super()' must be called in derived constructor before accessing |this| or returning non-object. (Safari)
错误类型
哪里出错了?
对于每个对派生类构造函数的 new
调用,super()
调用最多只能调用一次。通常,您需要准确地调用它一次,因为如果您不调用它,则父构造函数无法初始化 this
的值,因此您无法在派生构造函数中访问 this
,并且 this
不被认为是有效的已构造对象(并且如果派生构造函数在此状态下完成,则会抛出异常)。解决方法是从派生类构造函数返回一个对象,在这种情况下,返回的对象将用作已构造的对象而不是 this
,允许您不调用 super()
。不过,这很少使用。
示例
无效情况
js
class Base {
constructor() {
this.x = 1;
}
}
class Derived extends Base {
constructor() {
console.log(this.x);
// The Base constructor is not called yet, so this.x is undefined
// ReferenceError: must call super constructor before using 'this' in derived class constructor
}
}
有效情况
js
class Base {
constructor() {
this.x = 1;
}
}
class Derived extends Base {
constructor() {
super();
console.log(this.x); // 1
}
}