object.getprototypeof是定位原型链断裂、继承失效或意外覆盖的最快捷工具,直接返回对象内部[[prototype]],结果稳定可靠,可用于逐级追踪原型链、验证继承关系及区分原型与自有属性。

Object.getPrototypeOf 是定位原型链断裂、继承失效或意外覆盖的最快捷工具之一。它直接返回指定对象的内部 [[Prototype]],不依赖 __proto__(非标准且已废弃),也不受属性遮蔽干扰,结果稳定可靠。
确认对象真实原型是否符合预期
当方法调用报错 “is not a function” 或属性访问返回 undefined,先查原型是否连对了:
- 用
Object.getPrototypeOf(obj)拿到 obj 的直接原型 - 对比你期望的构造函数原型(如
MyClass.prototype)是否一致 - 若返回
null,说明该对象是“原型链终点”,没有继承任何东西
例如:const child = Object.create(null); Object.getPrototypeOf(child) 返回 null,此时它连 Object.prototype 都没有,自然没有 toString 等基础方法。
逐级追踪原型链,定位断点位置
配合循环调用,可打印完整原型链,快速发现哪一环丢失或错位:
- 从目标对象开始,反复调用
Object.getPrototypeOf - 每一步都检查是否为
null,或是否跳到了意外的原型(比如本该是Array.prototype却到了Object.prototype) - 常见断点:手动赋值
obj.__proto__ = null、Object.create(null)、类继承时忘记super()导致实例原型未正确设置
小技巧:写个简短辅助函数:function logProtoChain(obj) { let p = obj; while (p) { console.log(p); p = Object.getPrototypeOf(p); } }
区分原型与自有属性,避免误判继承问题
原型链故障常被误认为“属性没定义”,其实可能是属性在原型上但被遮蔽,或根本不在原型链上:
-
obj.hasOwnProperty('method')只看自有属性 -
'method' in obj查整个原型链,但无法指出在哪一级 -
Object.getPrototypeOf(obj)+hasOwnProperty组合,能精准定位属性存在于哪一级原型
例如:想确认 arr.push 是否来自 Array.prototype,可执行 Object.getPrototypeOf(arr) === Array.prototype —— 返回 true 就说明链路正常。
验证类继承关系是否生效
ES6 类语法下,子类实例的原型链应包含子类原型、父类原型、Object.prototype:
- 创建实例后,立即用
Object.getPrototypeOf(instance)检查是否等于SubClass.prototype - 再查
Object.getPrototypeOf(Object.getPrototypeOf(instance))是否等于ParentClass.prototype - 若第二步返回
Object.prototype,说明extends ParentClass没生效,可能父类不是函数、或子类构造器中未调用super()
注意:箭头函数不能用作构造函数,若错误地将箭头函数设为父类,Object.getPrototypeOf 会暴露其原型为 Function.prototype,而非预期的自定义原型。











