判断对象是否属于同一继承体系的关键是原型链是否存在共同祖先,而非构造函数是否相同;可用object.prototype.isprototypeof()、instanceof或逐级获取原型链比对来验证,需注意null原型、手动赋值断链及原始值无原型链等陷阱。

判断对象是否属于同一个继承体系,关键不是看它们是不是“同个类的实例”,而是看它们的原型链有没有共同祖先——也就是是否存在共享的原型对象。这比单纯比构造函数名或 class 名更本质、更可靠。
用 Object.prototype.isPrototypeOf() 检查原型链归属
这是最直接、最底层的方式:只要某个原型对象存在于目标对象的原型链中,就说明该对象“继承自”它。
- 例如:
Array.prototype.isPrototypeOf([1, 2])返回true,因为数组实例的原型链顶端连着Array.prototype - 再比如:
EventTarget.prototype.isPrototypeOf(new Event('click'))也返回true,说明Event实例属于以EventTarget为基类的体系 - 对自定义类也一样:
Parent.prototype.isPrototypeOf(childInstance)能准确反映继承关系,哪怕childInstance是通过多层继承得来的
用 instanceof 判断是否在某构造函数的原型链上
instanceof 本质上是检查右操作数的 prototype 是否在左操作数的原型链中,适合快速验证“是否是某类(或其子类)的实例”。
- 优点是写法简洁:
obj instanceof MyClass - 但要注意跨 iframe 或不同执行上下文时可能失效,因为不同环境中的
Array构造函数不是同一个引用 - 对纯原型对象(比如用
Object.create(parentProto)创建的)依然有效,前提是原型链没被切断
对比原型链顶端,找共同祖先
如果想确认两个对象是否“同源”,可以逐级向上提取原型,直到找到 null,再比对路径中是否有重合的原型节点。
- 用
Object.getPrototypeOf(obj)一步步往上走 - 把每个对象的完整原型链存成数组,然后找最长公共前缀(比如都经过
Animal.prototype → LivingThing.prototype → Object.prototype) - 特别注意:
Object.prototype是几乎所有对象的终点,所以仅靠它不能说明“同一体系”,得看中间是否有共有的自定义原型
避开常见陷阱
有些情况看似有继承关系,实际原型链已断开:
-
Object.create(null)创建的对象没有Object.prototype,它的原型链止于null,任何isPrototypeOf或instanceof Object都会失败 - 手动赋值
Child.prototype = { ... }会切断与父类原型的连接,必须用Object.create(Parent.prototype)或class Child extends Parent来保持链路 - 原始值(如字符串、数字)没有原型链,
"abc" instanceof String为false,但装箱后(new String("abc"))才有











