要动态分析对象的完整原型链,应使用object.getprototypeof逐级获取原型直至null;可封装为循环遍历函数,返回从实例到object.prototype的原型数组;结合getownpropertynames和hasownproperty可区分属性归属层级;该方法在跨iframe场景下比instanceof更可靠。

要动态分析一个对象的完整原型链结构,关键是逐级获取其原型并停止在 null。这不是静态声明能解决的问题,而是运行时探查的过程。
用 Object.getPrototypeOf 一层层向上取原型
这是最标准、最可靠的方式。它不依赖构造函数名或类定义,直接读取对象内部的 [[Prototype]] 链接:
- 调用
Object.getPrototypeOf(obj)得到它的直接原型; - 对返回值再次调用该方法,继续向上;
- 当结果为
null时,说明已到达原型链终点。
例如:Object.getPrototypeOf([]) 返回 Array.prototype,Object.getPrototypeOf(Array.prototype) 返回 Object.prototype,Object.getPrototypeOf(Object.prototype) 返回 null。
写一个通用的原型链遍历函数
把上面逻辑封装成可复用的工具函数,能清晰呈现整个继承路径:
- 初始化空数组,用于收集每层原型;
- 用
while循环持续调用Object.getPrototypeOf; - 每次非
null结果都 push 进数组; - 循环结束即得到从对象自身开始、直到
null的完整链路。
这样返回的数组顺序是:实例 → 构造函数原型 → 上层原型 → … → Object.prototype → 终止。
区分自有属性和继承属性
光知道原型链还不够,还要判断某个方法或属性来自哪一层:
- 用
Object.getOwnPropertyNames(obj)获取对象自身的所有字符串键(含不可枚举); - 配合
hasOwnProperty可快速判断是否为自有属性; - 若不在自身,再沿着原型链逐层检查——在哪个原型上
hasOwnProperty为true,就属于那一层。
比如 arr.map 不在 arr 自身,但在 Array.prototype 上存在,说明它是继承来的数组方法。
跨 iframe 场景下更稳定
在多个执行上下文(如不同 iframe)之间,instanceof 会失效,因为构造函数引用不同;但 Object.getPrototypeOf 始终基于对象本身的内部链接,不受环境隔离影响。
- 它不比较构造函数,只读取 [[Prototype]];
- 即使两个 iframe 各自定义了
class Person,只要原型链结构一致,就能正确识别继承关系; - 调试跨上下文对象时,这是唯一可信的原型探查方式。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











