super不能直接获取父类原型,仅限构造函数中调用super()或方法中调用super.methodName();动态获取需用Object.getPrototypeOf(B.prototype)或Object.getPrototypeOf(this.constructor.prototype)。

在 JavaScript 的 class 语法中,super 关键字**不能直接用于动态获取父类原型对象**。它只能在特定上下文中使用:构造函数中调用父类构造器(super()),或在实例/静态方法中调用父类同名方法(super.methodName())。你无法像 Object.getPrototypeOf(this).constructor.prototype 那样把 super 当作一个可读取、可赋值的引用去“动态获取”父类原型。
super 不是原型引用,而是调用语法糖
super 本身不是一个对象或属性,而是一种语义化的调用机制,由 JavaScript 引擎在运行时根据当前方法的词法环境和继承链自动解析目标对象(通常是 Object.getPrototypeOf(当前类.prototype) 对应的原型)。它不暴露原型本身,只允许你调用其上的方法或访问其上的属性(仅限于 getter)。
-
super.xxx只能在对象方法或静态方法内部使用,且必须有明确的父类定义(即当前类有extends) -
super在箭头函数、普通函数或全局作用域中无效 - 你不能写
const parentProto = super;或console.log(super.constructor)—— 这会报语法错误
想动态获取父类原型?用 Object.getPrototypeOf 配合 constructor
如果目标是**在子类方法中动态拿到父类的 prototype 对象**(比如做反射、代理、或手动调用某个未被覆盖的方法),正确方式是:
- 对实例方法:用
Object.getPrototypeOf(Object.getPrototypeOf(this)) - 更可靠通用的方式:
Object.getPrototypeOf(this.constructor.prototype)
示例:
class A {
say() { return 'A'; }
}
class B extends A {
say() { return 'B'; }
getParentPrototype() {
// ✅ 正确:拿到 A.prototype
return Object.getPrototypeOf(B.prototype); // 等价于 A.prototype
// 或
return Object.getPrototypeOf(this.constructor.prototype);
}
}
const b = new B();
console.log(b.getParentPrototype().say()); // 'A'
super.method() 的本质就是查父类原型上的方法
当你写 super.say(),引擎实际做了类似下面的事:
- 找到当前方法所在的类(这里是
B) - 获取
B.prototype的原型 → 即A.prototype - 在
A.prototype上查找say方法并以this绑定当前实例调用
所以 super.say() 和 Object.getPrototypeOf(B.prototype).say.call(this) 行为一致(前提是 say 是原型方法且没被遮蔽)。
注意:super 在静态方法中指向父类构造器
静态方法里的 super 指向的是父类本身(即构造函数),不是其原型:
class A {
static hello() { return 'A'; }
}
class B extends A {
static hello() {
return super.hello() + ' → B'; // ✅ 调用 A.hello()
// super.prototype ❌ 不存在,super 在静态上下文中不是原型
}
}
此时 super 相当于 Object.getPrototypeOf(B)(即 A),可用于访问父类静态属性或方法,但依然不能“取出”它的原型对象(A.prototype)——那得显式写 A.prototype 或用 Object.getPrototypeOf(B).prototype。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











