object.getprototypeof用于获取对象的直接原型,适用于动态探查继承链;不可用于原始值;可结合循环遍历完整原型链;配合属性描述符方法可区分自有属性与继承属性;在跨iframe场景下比instanceof更可靠。

Object.getPrototypeOf 是获取对象原型(即其 [[Prototype]])的最直接方式,它不依赖构造函数或类名,适合在运行时动态探查任意对象的继承链和结构特征。
快速定位对象的直接原型
调用 Object.getPrototypeOf(obj) 返回该对象内部 [[Prototype]] 指向的对象。这对判断对象“真正继承自谁”非常关键——比如区分是普通对象、数组、日期还是自定义类实例:
Object.getPrototypeOf({}) === Object.prototypeObject.getPrototypeOf([]) === Array.prototypeObject.getPrototypeOf(new Date()) === Date.prototypeObject.getPrototypeOf(new MyComponent()) === MyComponent.prototype
注意:不能用于原始值(如 Object.getPrototypeOf(42) 会报错),需确保传入的是对象。
遍历整个原型链,还原完整继承结构
结合循环和 Object.getPrototypeOf,可逐级向上提取所有原型,直到到达 null(原型链终点)。这相当于手动实现 Object.getPrototypeOf 的“深度版”:
function getPrototypeChain(obj) {
const chain = [];
let current = obj;
while (current !== null && current !== undefined) {
chain.push(current);
current = Object.getPrototypeOf(current);
}
return chain;
}
返回结果是一个从实例自身开始、依次为各层原型的数组,可用于分析方法/属性在哪一层定义,或检查是否混入了特定原型(如 EventTarget.prototype)。
配合 Object.getOwnPropertyNames 和 getOwnPropertyDescriptor 分析可枚举性与属性来源
仅看原型不够,还需确认某个属性是定义在当前对象上,还是从原型继承而来。典型组合用法:
- 用
Object.getOwnPropertyNames(obj)查当前对象自有属性(含不可枚举) - 用
Object.getOwnPropertyDescriptor(obj, key)查某属性是否为enumerable: false或有get/set - 对比
key in obj与obj.hasOwnProperty(key)判断是否继承
例如:obj.toString 通常来自 Object.prototype,Object.getPrototypeOf(obj).hasOwnProperty('toString') 为 true,而 obj.hasOwnProperty('toString') 为 false。
识别内置对象与跨 iframe 边界问题
在多 iframe 环境中,不同上下文的 Array 构造函数不同,instanceof Array 可能失效,但 Object.getPrototypeOf(arr) === Array.prototype 在同源 iframe 内依然可靠(前提是访问到目标 iframe 的 Array.prototype)。更稳妥的做法是比对原型的 constructor.name 或使用 toString.call(arr),但 getPrototypeOf 提供了更底层的验证入口。











