super()是调用父类构造器的指令,仅限子类构造函数中初始化this;super.xxx是访问父类原型或类上属性/方法的引用机制,仅限类方法内使用,二者语法、时机和实现完全不同。

super 在 JavaScript 中不是普通关键字,而是一个特殊的语法引用,它的行为完全取决于上下文:在构造函数中作为函数调用,在方法中作为对象引用。二者语义不同、使用位置受限、绑定目标也不同——混淆会导致 ReferenceError 或意外的 this 指向。
super() 作为函数调用:只在子类构造函数中有效
在子类 constructor 中,super() 是必须显式调用的(除非子类没有构造函数),它负责初始化父类的 this,并把当前实例交给父类构造逻辑处理。
- 不写
super()会报错:ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor - 必须在访问
this之前调用,否则语法错误 - 调用时可传参,这些参数会传给父类构造函数
- 不能在普通函数、箭头函数或非构造函数方法中使用
super()
示例:
class Parent {constructor(name) {
this.name = name;
}
}
class Child extends Parent {
constructor(name, age) {
super(name); // ✅ 正确:初始化父类 this
this.age = age;
}
}
super 作为对象引用:只在对象方法(含 getter/setter)中有效
在类的方法(包括原型方法、静态方法、getter/setter)中,super 指向父类的原型(对实例方法)或父类本身(对静态方法)。它用于访问被子类覆盖的父类同名方法或属性。
- 只能在方法内部使用,不能在构造函数体顶层(除
super()外)或函数外部直接写super.xxx - 访问属性或调用方法时,
this仍指向当前实例(或当前类),不是父类实例 - 不可解构、不可赋值、不可
typeof,仅支持点号或方括号访问 - 静态方法中
super指向父类(而非父类的prototype)
示例:
class Parent {getName() { return 'Parent'; }
static getType() { return 'Base'; }
}
class Child extends Parent {
getName() {
return 'Child + ' + super.getName(); // ✅ 调用父类方法
}
static getType() {
return 'Derived ' + super.getType(); // ✅ 静态方法中 super 指向 Parent 类
}
}
常见误区与限制
-
super不是对象变量,不能赋值(super = {}报错)、不能传参、不能作为函数参数传递 - 不能在箭头函数中单独使用
super(因箭头函数无自己的this和super绑定,但可访问外层方法中的super) - 在 getter/setter 中使用
super时,读写的是父类对应描述符定义的逻辑,不是父类实例上的自有属性 - 若父类没定义某方法,
super.xxx返回undefined;调用它会报TypeError
本质区别一句话总结
super() 是**调用父类构造器的指令**,发生在子类实例化初期;super.xxx 是**在运行时动态查找父类原型(或类)上属性/方法的引用机制**,依赖于当前方法所在的类继承链和调用时的 this 值。两者共用同一个词,但语法阶段、求值时机和底层实现完全不同。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











