JavaScript原型链调试:使用Object.getPrototypeOf
Object.getPrototypeOf是获取对象直接原型的标准方法,相较于非标准的__proto__属性,它更加规范安全。通过它可以逐级遍历原型链,准确定位方法来源于哪个原型。结合hasOwnProperty方法能够区分属性是对象自有的还是继承来的。注意原型链的终点是null,应避免对null或undefined调用该方法。
要确定一个对象的直接原型,标准方法是 Object.getPrototypeOf。相比 __proto__ 这种非标准的老路子,它更为规范,也更安全。尤其在调试原型链、梳理继承关系和方法来源时,它是不可或缺的工具。

Object.getPrototypeOf 是查看对象直接原型的可靠手段,比 __proto__ 更规范、更安全,特别适合在调试原型链时定位继承关系和方法来源。
看清对象的“上一级”是谁
每个对象(除了 null)都有一个直接原型,Object.getPrototypeOf(obj) 的作用正是返回该对象内部 [[Prototype]] 指向的那个对象。你可以把它理解为 obj.__proto__ 的标准替代写法。
- 对普通对象,它通常指向
Object.prototype这根大梁 - 对数组,指向
Array.prototype - 对函数,指向
Function.prototype - 对用 class 创建的实例,指向对应类的
prototype属性
逐级遍历原型链,定位方法来源
有时候你想知道某个方法到底挂在原型链的哪一层,可以写一个循环配合 Object.getPrototypeOf 向上追溯:
function tracePrototype(obj, methodName) {
let current = obj;
while (current) {
if (current.hasOwnProperty(methodName)) {
console.log(`Found ${methodName} on:`, current);
break;
}
current = Object.getPrototypeOf(current);
}
}
举个例子,tracePrototype([1,2], 'map') 会告诉你 map 方法定义在 Array.prototype 上——也就是数组实例的直接原型上。
区分“自有属性”和“继承属性”
接着上面的思路,把 hasOwnProperty 和 Object.getPrototypeOf 组合起来,就能清晰地判断一个属性是属于对象自身,还是从原型链上继承来的:
obj.hasOwnProperty('x')→ 检查属性是否在obj自身上'x' in obj→ 检查是否在obj或其任意原型上Object.getPrototypeOf(obj).hasOwnProperty('x')→ 检查是否在直接原型上
这种组合在排查意外覆盖或方法丢失时非常有效。比如你明明觉得某个方法应该能调用,结果却报错,顺着这个思路一查,往往就能发现问题所在。
注意 null 原型链终点
原型链走到头就是 null —— 这是所有原型链的终点。你调用 Object.getPrototypeOf(Object.prototype) 会返回 null,再往上就会报错。
- 循环里务必检查
current === null,否则会死循环 - 不要对
null或undefined调用该方法,否则会直接报 Type 错误 - 箭头函数没有
prototype,但总有原型(Function.prototype),用Object.getPrototypeOf就能看到
说来说去,这些概念并不复杂,但它们是最容易被忽视的细节。搞清它们,调试原型链时能省下不少弯路。
