SyntaxError: super() 只能在派生类构造函数中使用

super() 调用用于非 构造函数 的主体(在使用 extends 关键字的类中)时,就会发生 JavaScript 异常“super() 仅在派生类构造函数中有效”。

消息

SyntaxError: 'super' keyword unexpected here (V8-based)
SyntaxError: super() is only valid in derived class constructors (Firefox)
SyntaxError: super is not valid in this context. (Safari)

错误类型

哪里出错了?

super() 调用用于调用派生类的基构造函数,以便基类可以初始化 this 对象。在其他任何地方使用它都没有意义。

super() 也可以在嵌套在构造函数中的箭头函数中定义。但是,它不能在任何其他类型的函数中定义。

示例

无效情况

如果类没有 extends,则不能调用 super(),因为没有基类可以调用

js
class Base {
  constructor() {
    super();
  }
}

即使该方法是从构造函数调用的,也不能在类方法中调用 super()

js
class Base {}

class Derived extends Base {
  constructor() {
    this.init();
  }

  init() {
    super();
  }
}

即使该函数用作构造函数,也不能在函数中调用 super()

js
function Base(x) {
  this.x = x;
}

function Derived() {
  super(1);
}

Object.setPrototypeOf(Derived.prototype, Base.prototype);
Object.setPrototypeOf(Derived, Base);

有效情况

可以在构造函数中调用任何其他方法之前调用 super()

js
class Base {}

class Derived extends Base {
  constructor() {
    super();
    this.init();
  }

  init() {
    // ...
  }
}

可以在嵌套在构造函数中的箭头函数中调用 super()

js
class Base {}

class Derived extends Base {
  constructor() {
    const init = () => {
      super();
    };

    init();
  }
}

另请参阅