检测对象是否通过原型继承,最可靠方式是用isprototypeof()方法:prototypeobj.isprototypeof(instanceobj),它直接检查原型链中是否存在指定原型,不依赖构造函数,而instanceof依赖构造函数且跨环境可能失效。

检测一个对象是否通过原型继承而来,关键不是看它“是不是实例”,而是看它的原型链里有没有你关心的那个原型对象。最直接、标准且可靠的方式是使用 isPrototypeOf() 方法。
用 isPrototypeOf() 检查原型链存在性
这个方法由「潜在的原型对象」调用,传入待检测的对象,返回 true 表示该原型确实出现在目标对象的整个原型链中(包括直接或间接原型)。
- 语法固定为:
prototypeObj.isPrototypeOf(instanceObj) - 必须是对象调用,原始值(如
null、undefined、字符串字面量)会抛TypeError - 不依赖构造函数或
constructor属性,只认实际的原型链引用 - 例如:
Array.prototype.isPrototypeOf([1, 2])→true;Object.prototype.isPrototypeOf({})→true
对比 instanceof:适用场景不同
instanceof 看的是「某个构造函数的 prototype 是否在对象原型链上」,它隐含了对构造函数的依赖。
- 适合判断是否由特定类/构造函数创建,比如
obj instanceof Date - 在跨 iframe 或不同执行上下文时可能失效(因为不同环境的
Date构造函数不相等) - 无法用于普通对象做原型的情况,比如
const parent = {}; const child = Object.create(parent);—— 这里没有构造函数,instanceof就无能为力
手动遍历原型链(理解原理用)
如果你需要更底层控制,或想封装自定义逻辑,可以用 Object.getPrototypeOf() 循环向上检查:
- 从目标对象开始,反复调用
Object.getPrototypeOf() - 每次拿到当前原型后,与目标原型用
===比较 - 遇到
null还没匹配上,就说明不在原型链中 - 注意:
__proto__是非标准属性,不要在生产代码中使用
哪些情况会判断失败?
不是方法不准,而是原型链本身被改变了:
- 用
Object.create(null)创建的对象,原型链终点是null,不继承Object.prototype,所以Object.prototype.isPrototypeOf(obj)会返回false - 重写了构造函数的
prototype,但没用Object.create(Parent.prototype)建立连接,继承关系就断了 - 箭头函数没有
prototype属性,不能拿它的prototype去做isPrototypeOf检测











