Object.prototype.isPrototypeOf()用于检查原型链关系,调用格式为“原型对象.isPrototypeOf(待查对象)”,左侧是待确认的原型,右侧是待查对象且不能为null或undefined。

直接用 Object.prototype.isPrototypeOf() 方法,它专为这事设计——检查一个对象是否出现在另一个对象的原型链中。
isPrototypeOf() 的正确用法
调用必须是「原型对象.isPrototypeOf(待查对象)」,顺序不能反:
- 左侧必须是你要确认“是否在链上”的那个原型(比如
Array.prototype、Animal.prototype或任意普通对象) - 右侧是你想查的实例或对象,且不能是
null或undefined - 例如:
Array.prototype.isPrototypeOf([1, 2])→ true;{}.isPrototypeOf([])→ false
和 instanceof 的关键区别
instanceof 看的是「构造函数.prototype 是否在对象原型链上」,而 isPrototypeOf() 更底层、更自由:
-
instanceof必须有构造函数,且依赖.prototype属性;跨 iframe 时可能失效 -
isPrototypeOf()不关心是不是构造函数,只要原型链真实存在就认——比如用Object.create(parent)创建的对象,也能用parent.isPrototypeOf(child)直接验证
注意边界情况
有些对象原型链不完整,容易误判:
-
Object.create(null)创建的对象没有Object.prototype,所以Object.prototype.isPrototypeOf(obj)返回 false - 原始值(如字符串
"abc")本身不是对象,但包装后可参与判断:String.prototype.isPrototypeOf(new String("abc"))→ true - 不能在实例上调用:
obj.isPrototypeOf(proto)会报错,因为isPrototypeOf是原型对象的方法,不是实例方法
替代方案:手动遍历原型链
如果需要更精细控制(比如找具体在哪一层),可用 Object.getPrototypeOf() 循环向上查:
- 从目标对象开始,反复调用
Object.getPrototypeOf(obj) - 每次比较是否等于你要找的原型对象
- 直到返回
null还没找到,就说明不在链上

















