子类通过super.method()调用父类方法需满足两个前提:1. 子类必须用extends显式继承父类;2. 构造函数中必须先调用super()才能访问this。super.method()以父类原型为receiver调用,this仍指向子类实例。

在 JavaScript 中,子类通过 super.method() 调用父类同名方法,本质是利用 super 关键字访问父类原型(Parent.prototype)上的方法。这要求子类必须使用 extends 显式继承父类,且必须在构造函数中先调用 super()(否则无法访问 this),之后才能在实例方法中安全使用 super.method()。
必须满足的两个前提条件
1. 子类需用 extends 继承父类
只有通过 class Child extends Parent 建立的继承关系,super 才能正确绑定到父类原型。直接修改 Child.prototype.__proto__ 或用 Object.setPrototypeOf 模拟继承,super 不生效。
2. 构造函数中必须先调用 super()
在子类 constructor 中,若要使用 this,就必须第一行调用 super(...args)。否则会报错 ReferenceError: Must call super constructor in derived class before accessing 'this'。
super.method() 的实际行为
super.method() 并不是“把父类方法复制一份”,而是以父类原型为隐式接收者(receiver)调用该方法。这意味着:
- 方法内部的
this仍指向当前子类实例(不是父类实例); - 如果父类方法中访问了
this.xxx,读取的是子类实例上的属性(包括被子类重写的 getter/setter); - 若父类方法调用了另一个同名方法(如
this.helper()),而子类重写了helper,则实际执行的是子类版本(动态分派)。
典型使用场景与写法示例
常见于子类需要「扩展」而非「完全替换」父类逻辑时,比如日志、预处理、后置清理:
class Animal {
speak() {
console.log('Animal makes a sound');
}
}
class Dog extends Animal {
speak() {
console.log('Dog barks'); // 子类前置逻辑
super.speak(); // 调用父类同名方法
console.log('Bark ends'); // 子类后置逻辑
}
}
const d = new Dog();
d.speak();
// 输出:
// Dog barks
// Animal makes a sound
// Bark ends
注意事项与易错点
不能在静态方法里用 super.method() 调用实例方法:静态方法中的 super 指向父类本身(Parent),只能调用父类的静态方法。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
不能在箭头函数或普通函数中单独使用 super:super 只在类的方法体(含构造器、getter/setter、普通方法)中有效,脱离类上下文会语法错误。
避免在父类方法中误用 this 导致无限递归:例如父类方法里写 this.speak(),而子类重写了 speak 且又调用了 super.speak(),就可能形成循环调用 —— 这属于设计问题,需靠逻辑梳理避免。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










