super关键字仅在类的构造函数或方法中有效,对象字面量中使用会报语法错误;因其依赖类的[[HomeObject]]机制,而对象字面量无此绑定。

对象字面量中**不能使用 super 关键字**访问原型,这是 JavaScript 的语法限制。
super 只在类方法中有效
super 是专为 class 语法设计的关键字,只能出现在类的构造函数(constructor)或方法(包括 getter/setter、普通方法、静态方法)内部。它依赖于类的内部机制(如 [[HomeObject]] 绑定)来定位原型上的同名属性或方法。
- 对象字面量不是类,没有隐式绑定的
[[HomeObject]] - 即使对象有原型(通过
Object.create()设置),其方法内部也不能用super - 以下写法会直接报语法错误:
Uncaught SyntaxError: 'super' keyword unexpected here
对象字面量中模拟 super 行为的方法
若想在对象字面量中调用原型上的方法,需显式引用原型对象:
- 用
Object.getPrototypeOf(obj)获取原型,再手动调用方法 - 确保原型链上存在对应方法,且注意
this绑定(通常需用.call(obj, ...)) - 示例:
const parent = {
greet() { return "Hello"; }
};
const child = Object.assign(Object.create(parent), {
greet() {
// ❌ super.greet() → 语法错误
// ✅ 手动调用原型方法
const proto = Object.getPrototypeOf(this);
return `${proto.greet()} from child`;
}
});
console.log(child.greet()); // "Hello from child"
真正支持 super 的写法:必须用 class
只有在 class 中定义的方法才能安全使用 super:
立即学习“Java免费学习笔记(深入)”;
- 子类继承父类后,子类方法中可直接写
super.methodName() - 构造函数中可用
super(...)调用父类构造器 - 这背后由引擎自动维护
[[HomeObject]]和原型查找逻辑
class Parent {
greet() { return "Hello"; }
}
class Child extends Parent {
greet() {
return `${super.greet()} from child`; // ✅ 合法且推荐
}
}
为什么对象字面量不支持 super?
根本原因在于语言设计:ECMAScript 规范明确限定 super 的使用上下文为「类方法」和「类构造器」。对象字面量属于普通对象创建语法,不参与类的语义体系,因此不触发 super 解析机制。强行在字面量中使用会破坏语法一致性,也难以可靠推导出应访问哪个原型(尤其在多重委托或动态原型变更时)。


















