super.method()仅在子类构造函数、实例方法或静态方法中有效,本质是基于原型链的语法糖;不可用于普通函数、箭头函数或对象字面量方法,否则报错。

在 JavaScript 继承体系中,用 super.method() 调用父类原型上的方法,只在**类的构造函数、实例方法或静态方法中有效**,且必须在使用 this 之前确保已调用 super()(对构造函数而言);它本质上是语法糖,底层仍基于原型链查找。
super.method() 的作用范围
super.method() 不是直接访问父类原型对象,而是由 JavaScript 引擎在当前方法的词法环境中绑定的一个“父级方法调用上下文”。它只在以下位置合法:
- 子类的 构造函数 中(但此时只能调用
super(),不能调用super.xxx()) - 子类的 实例方法 中(可调用
super.父类原型方法名()) - 子类的 静态方法 中(可调用
super.父类静态方法名()) - 不支持在普通函数、箭头函数、对象字面量方法中使用
super
为什么不能在普通对象方法里用 super?
super 是类方法的专属语法,依赖类定义时的内部机制(如 [[HomeObject]])。对象字面量或函数表达式没有这种绑定,所以以下写法会报错:
const obj = {<br> method() {<br> super.other(); // ❌ SyntaxError: 'super' keyword unexpected here<br> }<br>};
正确调用父类原型方法的等价写法
如果因环境限制无法用 super(比如在非类方法中),可用原型链手动调用:
- 实例方法中:用
Object.getPrototypeOf(Object.getPrototypeOf(this)).methodName.call(this) - 更简洁常用的是:
ParentClass.prototype.methodName.call(this)(需提前持有父类引用) - 注意:不要写成
this.__proto__.__proto__.methodName(),因为__proto__非标准且易受修改影响
常见陷阱与注意事项
- 在子类构造函数中,必须在访问
this前调用super(),否则报错 -
super.method()中的this指向仍是当前实例(不是父类实例),所以可以正常访问子类新增属性 - 若父类方法被子类覆盖,
super.method()会跳过子类版本,准确调用父类原型上定义的那个 - 继承自内置类(如
Array、Promise)时,super行为一致,但需注意子类构造函数返回值规则











