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
  }
}

另请参阅