SyntaxError: super 属性/成员访问仅在方法或方法内部的 eval 代码中有效

当在方法之外使用 super.xsuper[x] 语法时,会发生 JavaScript 异常“super 属性/成员访问仅在方法或方法内的 eval 代码中有效”。

消息

SyntaxError: 'super' keyword unexpected here (V8-based)
SyntaxError: use of super property accesses only valid within methods or eval code within methods (Firefox)
SyntaxError: super is not valid in this context. (Safari)

错误类型

哪里出错了?

super.x 语法用于访问当前对象原型上的属性。它可用于 对象字面量字段初始化器静态初始化块 的方法中,但在其他上下文中无效。

示例

无效情况

不能在对象的方法之外使用 super.x

js
const obj = {
  __proto__: { x: 1 },
  x: super.x, // SyntaxError
};

不能在函数中使用 super.x,即使该函数具有作为方法的效果

js
function getX() {
  return super.x; // SyntaxError
}

const obj = {
  getX,
  getX2: function () {
    return super.x; // SyntaxError
  },
};

class Derived extends Base {
  getX = () => super.x;
}

有效情况

可以在方法中使用 super.x

js
class Base {
  x = 1;
}

class Derived extends Base {
  getX() {
    return super.x;
  }
}

可以在字段初始化器中使用 super.x

js
class Derived extends Base {
  x = super.x;
}

也可以在对象方法中使用 super.x

js
const obj = {
  __proto__: { x: 1 },
  getX() {
    return super.x;
  },
};

另请参阅