子类重写父类方法时须用 super 调用父类同名方法以实现扩展而非替换;构造函数中必须首行调用 super(),普通及静态方法中可用 super.方法名复用父类逻辑并支持前置/后置增强。

子类重写父类方法时,用 super 调用父类同名方法,就能在保留原有逻辑基础上添加新行为——这是 ES6 类继承中“扩展而非替换”的核心做法。
重写方法时必须显式调用 super(构造函数)
子类定义了自己的 constructor,就必须第一行调用 super(),否则会报错。因为子类实例需要先完成父类初始化,才能继续自己的初始化逻辑。
例如:
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // ✅ 必须先调用,传参需匹配父类构造函数
this.breed = breed; // ✅ 自己的初始化放后面
}
}
在普通方法中用 super 调用父类同名方法
子类重写实例方法(如 say())后,想复用父类逻辑,就用 super.say() 显式调用——它指向父类原型上的该方法,且自动绑定正确 this。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
常见写法有三种场景:
- 前置增强:在父类逻辑前加处理(如日志、校验)
- 后置增强:在父类逻辑后加处理(如清理、上报)
- 条件性调用:根据判断决定是否执行父类逻辑
class Animal {
say() {
console.log(`I'm ${this.name}`);
}
}
class Dog extends Animal {
say() {
console.log('Woof!'); // ✅ 前置增强
super.say(); // ✅ 调用父类原始逻辑
console.log('Tail wagging'); // ✅ 后置增强
}
}
new Dog('Leo').say();
// 输出:
// Woof!
// I'm Leo
// Tail wagging
注意 super 的作用域和限制
super 不是对象,而是关键字,只能在子类的构造函数或方法中使用;不能在箭头函数、普通函数或静态方法里直接用(除非静态方法中通过 super.方法名 调用父类静态方法)。
关键细节:
- 在实例方法中,
super.xxx()等价于Object.getPrototypeOf(Object.getPrototypeOf(this)).xxx.call(this) - 不能单独访问
super(如console.log(super)会语法错误) - 若父类方法返回值重要,子类可接收并加工:
const result = super.process(); return result + ' extended';
静态方法中也能用 super 扩展
子类静态方法可通过 super 调用父类静态方法,同样支持前置/后置逻辑。
class Animal {
static info() {
return 'An animal';
}
}
class Dog extends Animal {
static info() {
return super.info() + ' — and a dog'; // ✅ 组合父类返回值
}
}
Dog.info(); // "An animal — and a dog"

















