Object.getPrototypeOf 是定位原型链方法缺失的首选工具,可逐级验证原型是否正确、区分遮蔽与未定义、检查 constructor 一致性。

直接用 Object.getPrototypeOf 查一层、再查一层,比猜报错原因快得多。它返回对象真实的 [[Prototype]],不受 __proto__ 被改写或属性遮蔽干扰,是定位方法“明明写了却调不了”的第一工具。
先确认方法该在哪一级原型上
别急着翻源码,先验证你的预期是否成立:
- 执行
Object.getPrototypeOf(obj),看返回值是不是你认为该提供这个方法的原型(比如Array.prototype或MyClass.prototype) - 如果返回
Object.prototype或null,说明链路没连到目标原型——方法自然找不到 - 例如:
const arr = [];,Object.getPrototypeOf(arr) === Array.prototype应为true;若为false,就说明数组实例的原型被意外替换过
逐级往上查,找到断点位置
方法丢失,往往卡在某一级原型“突然没了”:
- 写个简单循环:从对象开始,反复调用
Object.getPrototypeOf,每步打印constructor?.name - 观察链条是否符合继承设计:比如子类实例 → 子类原型 → 父类原型 →
Object.prototype - 一旦发现某级返回
null,或跳到了意料之外的原型(如本该是Date.prototype却到了Object.prototype),那就是断点
区分“没定义”和“被遮蔽”
有时候方法其实存在,只是被同名自有属性盖住了:
-
obj.hasOwnProperty('methodName')返回true?说明是自有属性,不是原型上的 -
'methodName' in obj返回true但obj.methodName是undefined?大概率是原型上有,但被赋值为undefined的自有属性挡住了 - 精准定位:拿到
proto = Object.getPrototypeOf(obj)后,再查proto.hasOwnProperty('methodName'),就能确认方法是否真在那一级
检查 constructor 是否指向正确
constructor 错位常是方法丢失的间接信号:
- 运行
obj.constructor === ExpectedClass,如果不成立,再查Object.getPrototypeOf(obj).constructor - 如果原型上的
constructor指向Object,大概率是原型被字面量重写过且没补constructor: ExpectedClass - 这种情况下,即使方法还在原型上,
instanceof也会失效,后续依赖类型判断的逻辑都可能出问题


















