object.getprototypeof 是 ecmascript 规范推荐的原型链回溯方法,通过循环调用可安全获取完整原型链,避免使用已弃用的 __proto__;它不被对象自身属性遮蔽,但不支持原始值和 proxy 的 trap 拦截。

可以使用 Object.getPrototypeOf 逐层获取对象的原型,实现安全、标准的原型链回溯,避免直接操作非标准且已被弃用的 __proto__ 属性。
理解 Object.getPrototypeOf 的作用
Object.getPrototypeOf(obj) 返回参数对象内部 [[Prototype]] 指向的原型对象,等价于标准访问方式,是 ECMAScript 规范推荐的方法。它不依赖属性读取,不受对象自身属性遮蔽影响,比 obj.__proto__ 更可靠。
手动遍历原型链
从目标对象开始,反复调用 Object.getPrototypeOf,直到返回 null(即到达原型链末端):
- 初始化当前对象为起始值
- 每次调用
Object.getPrototypeOf(current)获取上一级原型 - 检查返回值是否为
null,是则停止;否则继续 - 可将每级原型存入数组,或在过程中做类型判断、方法查找等操作
例如:
const obj = { a: 1 };const chain = [];
let current = obj;
while (current !== null) {
chain.push(current);
current = Object.getPrototypeOf(current);
}
// chain 包含 obj、Object.prototype、null(最后一步后 current 为 null,未推入)
封装成可复用的回溯函数
常见需求如“查找某方法首次定义的位置”或“判断是否继承自某个构造器”,可用以下模式封装:
- 接收目标对象和可选终止条件(如构造函数、特定属性名、或最大遍历深度)
- 内部用
while循环 +Object.getPrototypeOf向上走 - 每步可检查
proto.constructor、typeof proto.xxx或proto.hasOwnProperty('xxx') - 返回匹配的原型、布尔结果或完整链数组
示例:查找具有指定方法的最近原型
function findPrototypeWithMethod(obj, methodName) {let proto = Object.getPrototypeOf(obj);
while (proto !== null) {
if (typeof proto[methodName] === 'function') return proto;
proto = Object.getPrototypeOf(proto);
}
return null;
}
注意边界与兼容性
Object.getPrototypeOf 在所有现代引擎中均支持(IE9+),但有几点需留意:
- 不能用于原始值(如
Object.getPrototypeOf(42)抛错),需先确保是对象 - 对
Object.create(null)创建的对象,首次调用即返回null - 若对象被冻结或设置了不可修改的
__proto__,Object.getPrototypeOf仍能正确读取内部 [[Prototype]] - 不适用于 Proxy 对象的 trap 拦截(除非 handler 显式转发),此时行为取决于代理配置










