Object.getPrototypeOf 是 super 寻址的唯一依据:实例方法中 super.xxx() 查 Object.getPrototypeOf(this) 一层的方法,构造调用中 super() 通过 Object.getPrototypeOf(子类.prototype) 获取父类原型并推导构造函数,其行为与 instanceof 共享同一原型链基础。

Class 编译后的产物(如 Babel 转译为 ES5 构造函数+原型赋值)能清晰暴露 Object.getPrototypeOf 在 super 寻址中的底层角色:它不是辅助工具,而是 super 定位父类方法的唯一依据。
super 在普通方法中实际调用的是 Object.getPrototypeOf(this) 上的方法
ES6 规定:super.xxx() 在实例方法中,语义等价于:
- 获取当前实例
this的原型对象 → 即Object.getPrototypeOf(this) - 在该原型对象上查找
xxx属性(不沿链继续向上,只查这一层) - 以
this为上下文调用该方法
这与直接写 this.__proto__.xxx.call(this) 行为一致,但更规范、不可篡改。Babel 转译后常显式使用 Object.getPrototypeOf 模拟此行为,例如:
// class B extends A { m() { super.m(); } }
// 转译片段示意:
function m() {
return Object.getPrototypeOf(B.prototype).m.call(this);
}
```
super() 构造调用依赖 Object.getPrototypeOf 确定父构造函数
子类 constructor 中的 super(...args) 并非简单调用某个固定函数,而是:
- 先通过
Object.getPrototypeOf(子类.prototype)获取父类的prototype - 再从该
prototype的constructor属性反推父构造函数(即Object.getPrototypeOf(子.constructor).prototype.constructor) - 最终执行该构造函数,并将
this绑定过去
也就是说,extends 建立的继承关系,在运行时完全靠 Object.getPrototypeOf 链接;删掉或篡改这个链接,super() 就会找不到父构造函数而报错。
Object.getPrototypeOf 是 instanceof 和 super 共享的原型链基础
instanceof 判断逻辑是:沿着 obj.__proto__ 向上,看是否某一层等于 Constructor.prototype;而 super 查找逻辑是:取 obj.__proto__ 这一层,查方法。二者都依赖同一套原型链接结构。
- 若手动用
Object.setPrototypeOf(child, null)断开链接,child instanceof Parent变false,同时super.xxx也会因找不到父原型而失效 - Babel 或 TypeScript 编译器生成的继承代码中,常显式调用
Object.getPrototypeOf来复现该链,确保与原生行为一致
调试时可直接用 Object.getPrototypeOf 验证 super 的寻址路径
当 super.xxx 行为不符合预期,不要猜“是不是没继承好”,直接验证原型链:
-
console.log(Object.getPrototypeOf(Child.prototype) === Parent.prototype)—— 应为true,否则super找不到父方法 -
console.log(Object.getPrototypeOf(new Child()).constructor === Parent)—— 若为false,说明super()未正确触发父构造函数 - 注意:
super永远只查Object.getPrototypeOf(this)这一层,不会自动跳到Object.getPrototypeOf(Object.getPrototypeOf(this))

















