instanceof 检测构造函数的 prototype 是否在对象原型链中,isprototypeof() 检测调用者对象本身是否在目标对象原型链中;前者语义清晰适合常规类型判断,后者更底层通用,适用于跨原型链精确控制场景。

判断一个对象是否属于某个类或是否在某条原型链上,核心就靠 instanceof 和 isPrototypeOf()。它们目标相似,但角色不同:一个看“是不是这个类造出来的”,另一个看“是不是这条链上的祖先”。
instanceof:检测对象是否由指定构造函数创建
它左边是实例对象,右边是构造函数(如 Date、Array、自定义类),内部检查的是「该构造函数的 prototype 是否出现在对象的原型链中」。
-
new Date() instanceof Date→true -
[] instanceof Array→true -
{} instanceof Object→true(所有普通对象都继承自Object) -
new Date() instanceof Object→true(因为Date.prototype的原型链最终连到Object.prototype)
注意:它依赖构造函数的 prototype 属性,所以对通过 Object.create(null) 创建的对象或跨 iframe 的对象可能失效。
isPrototypeOf():检测某个对象是否存在于另一对象的原型链中
它调用者必须是一个对象(通常是某个 prototype),参数是待检测的目标对象。本质是问:“我是不是它的原型(或更上层的原型)?”
-
Array.prototype.isPrototypeOf([])→true -
Object.prototype.isPrototypeOf({})→true -
Animal.prototype.isPrototypeOf(dog)→true(若dog是new Animal()创建) -
Function.prototype.isPrototypeOf(function(){})→true(函数对象的原型链包含Function.prototype)
和 instanceof 不同,它不关心构造函数,只认原型对象本身,因此更底层、更通用。
二者关键区别一句话说清
instanceof A 是「A 构造函数的 prototype 在不在左边对象的原型链里」;A.isPrototypeOf(B) 是「A 这个对象本身在不在 B 的原型链里」。
- 所以
Array instanceof Array是false(Array是函数,不是Array.prototype) - 但
Array.prototype.isPrototypeOf([])是true - 而
Array.prototype.isPrototypeOf(Array)是false(Array函数的原型是Function.prototype,不是Array.prototype)
实际使用建议
多数场景下优先用 instanceof —— 语义清晰,符合面向对象直觉,比如判断是否为数组、正则、自定义类实例。
- 需要兼容跨 iframe 场景时,改用
Object.prototype.toString.call(obj) === '[object Array]' - 调试原型链或编写工具函数(如深克隆、属性遍历)时,
isPrototypeOf()更灵活,能精确控制链路起点 - 避免直接访问
__proto__,应使用标准方法Object.getPrototypeOf(obj)配合手动遍历实现逻辑











