super只能访问父类原型上的方法、getter/setter或可枚举原型属性,不能读取父类构造函数中挂载到this的实例属性;实例属性应直接用this访问,super在constructor中仅能调用super()。

super 不是用来“引用父类属性”的通用工具,它只在特定上下文中有效,且不能直接读取父类实例上的普通属性(比如 this.name)。真正安全、符合语义的用法,是通过 super.xxx 访问父类原型上定义的**方法、getter/setter 或可枚举的原型属性**,而不是父类构造函数中挂载到 this 上的实例属性。
只能在类方法里用 super.xxx,不能在构造函数体顶层写
你不能在子类构造函数里写 super.name 去读父类设置的 this.name——这会报错 ReferenceError: super is not defined。因为此时 super 只能作为函数调用(super()),不能当对象访问。
- ✅ 正确场景:在子类的实例方法、getter、setter 或静态方法中使用
super.xxx - ❌ 错误场景:在 constructor 里写
console.log(super.name)或const x = super.value - ⚠️ 注意:即使父类有
get name() { return this._name; },你才能用super.name;纯赋值属性this.name = 'xxx'不属于原型,super.name拿不到
访问的是父类原型,不是父类实例
super.xxx 查找的是父类的 prototype(对实例方法)或父类本身(对静态方法),不是某个父类实例。这意味着:
- 如果父类在构造函数里写了
this.id = 123,这个id是实例属性,super.id读不到 - 如果父类定义了
get id() { return this._id; },那super.id就能正常触发 getter - 如果父类原型上有
getName() { return this.name; },super.getName()可以调用,且this仍指向当前子类实例
想读父类实例属性?得靠 this,不是 super
父类构造函数中挂到 this 上的属性(如 this.title、this.config),子类继承后默认就存在当前实例上,直接用 this.title 即可,不需要、也不能用 super.title。
- 父类:
constructor(title) { this.title = title; } - 子类:
constructor(title, type) { super(title); this.type = type; }<br>show() { console.log(this.title, this.type); // ✅ 直接读 this - 不要写:
console.log(super.title); // ❌ 报错或 undefined
真要绕过子类覆盖读原始值?用 prototype 显式调用(慎用)
极少数情况下,子类重写了 getter,但你想强制拿到父类原始逻辑的结果,可以这样:
-
Parent.prototype.getTitle.call(this)—— 手动绑定this并调用父类原型方法 - 不推荐日常使用,破坏封装,仅用于调试或特殊元编程场景
- 这不是
super的用途,而是底层原型操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











