判断对象间“血缘关系”本质是检查一个对象是否在另一个对象的原型链上;最可靠方法是用 isPrototypeOf(),其次为 instanceof,手动遍历原型链最灵活,而 constructor 属性不可靠。

判断两个对象是否有“血缘关系”,在 JavaScript 中本质是检查**一个对象是否在另一个对象的原型链上**——也就是它们是否构成“实例 ← 原型 ← 更上层原型…”这样的继承路径。这不是看构造函数名字是否相同,而是看原型链是否连通。
用 isPrototypeOf() 直接验证原型存在性
这是最贴近“血缘”语义的方法:若 A.prototype.isPrototypeOf(B) 返回 true,说明 A 的原型对象(即 A.prototype)位于 B 的原型链中,B 是 A 的“后代”。
- 右侧可以是任意对象(包括数组、普通对象、自定义实例),左侧必须是某个对象(通常是构造函数的 prototype)
- 不依赖构造函数,跨 iframe 场景下比 instanceof 更稳定(只要原型对象本身可访问)
- 示例:
Array.prototype.isPrototypeOf([1,2]); // trueObject.prototype.isPrototypeOf({}); // true{}.constructor.prototype.isPrototypeOf(new Date()); // true(Date.prototype 继承自 Object.prototype)
用 instanceof 检查构造函数继承关系
语法为 obj instanceof Constructor,它内部等价于 Constructor.prototype.isPrototypeOf(obj)。适合你已知构造函数名、想快速确认类型归属的场景。
- 右侧必须是函数(有 prototype 属性),否则报错
- 注意局限:在 iframe 或 Web Worker 中,不同全局环境下的 Array 构造函数不是同一个引用,
iframeArr instanceof Array可能返回 false - 示例:
[1,2] instanceof Array; // truenew Date() instanceof Object; // true(因为 Date.prototype → Object.prototype)
手动遍历原型链做精细判断
当你需要控制查找逻辑(比如排除某一层、记录路径、或兼容老旧环境),可以用 Object.getPrototypeOf() 逐级向上比对:
- 获取对象直接原型:
Object.getPrototypeOf(obj) - 循环向上查,直到返回 null 或匹配目标原型:
function isInPrototypeChain(child, targetProto) {<br> let p = Object.getPrototypeOf(child);<br> while (p !== null) {<br> if (p === targetProto) return true;<br> p = Object.getPrototypeOf(p);<br> }<br> return false;<br>} - 这个方式完全绕过构造函数,只认原型对象本身,语义最纯粹
避免用 constructor 属性判断
obj.constructor === SomeClass 不可靠:
- constructor 可被随意改写:
Child.prototype.constructor = Parent; - 箭头函数、class 表达式、Object.create 创建的对象可能没有预期的 constructor
- 原型链上多个 constructor 属性,容易混淆“谁生了谁”


















