在 javascript class 中,子类必须在 constructor 首行调用 super() 初始化父类,否则报错;普通方法中用 super.方法名() 调用父类原型方法,this 仍指向子类实例;super 还支持静态方法、getter/setter 和私有方法,但不可解构或遍历。

在 JavaScript 的 Class 语法中,子类重写父类方法后,若想在子类方法中调用父类同名方法(即“深度调用”),需使用 super 关键字。它不是简单地“跳转到父类”,而是严格绑定当前实例(this)并调用父类原型上的对应方法。
super 必须在子类 constructor 中调用 super() 初始化父类
这是前提:如果子类定义了 constructor,必须第一行调用 super(),否则会报错 ReferenceError: Must call super constructor in derived class before accessing 'this'。
这是因为子类实例的内存空间和内部属性(如 [[Prototype]] 链)依赖父类构造函数初始化。
- 不写
constructor,JS 会自动提供一个隐式构造器,里面已含super(...arguments) - 写了
constructor就必须显式调用super(),且必须在访问this前
在普通方法中用 super.方法名() 调用父类同名方法
在子类的实例方法(非静态)中,可通过 super.方法名() 直接调用父类原型上定义的同名方法。此时 this 仍指向当前子类实例,因此父类方法内访问的 this.xxx 是子类实例的属性。
例如:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name} makes a sound.`;
}
}
class Dog extends Animal {
speak() {
return super.speak() + ' — Woof!';
}
}
const dog = new Dog('Buddy');
console.log(dog.speak()); // "Buddy makes a sound. — Woof!"
注意:super.speak() 不是“复制父类逻辑”,而是沿原型链查找 Animal.prototype.speak 并以当前 dog 实例为 this 执行。
super 可用于静态方法、getter/setter 和私有字段(ES2022+)
super 不仅限于普通方法,还可用于:
- 静态方法中:用
super.静态方法名()调用父类静态方法(super指向父类构造函数) - getter/setter 中:如
get value() { return super.value; }(调用父类 getter) - 私有字段(
#field):ES2022 起支持super.#privateMethod()(但不能访问父类私有字段,只能调私有方法)
super 不是对象,不能解构或遍历
super 是关键字,不是真实对象,所以不能:
-
console.log(super)(语法错误) -
const { speak } = super(报错) -
Object.keys(super)(无效)
它只在方法体内、作为属性访问或调用的前缀时合法,作用域严格受限。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











