isPrototypeOf 是 Object.prototype 上的方法,用于检测调用者是否在参数对象的原型链中;语法为 prototypeObj.isPrototypeOf(instanceObj),返回布尔值;参数须为对象,原始值会装箱,箭头函数无 prototype 故不可用。

isPrototypeOf 是 JavaScript 中用于检测一个对象是否存在于另一个对象的原型链上的方法。它不是函数,而是定义在所有对象原型(Object.prototype)上的方法,调用者必须是**潜在的原型对象**,参数是**待检测的目标对象**。
基本用法和语义
语法:prototypeObj.isPrototypeOf(instanceObj)
返回值:true 表示 prototypeObj 在 instanceObj 的原型链中(含直接原型、间接原型),否则为 false。
注意:不能颠倒顺序 —— 不能写成 instanceObj.isPrototypeOf(prototypeObj),那会报错或返回 false(除非实例本身是原型的原型,逻辑上不合理)。
常见使用场景
-
判断是否继承自某个构造函数的原型:
Array.prototype.isPrototypeOf([1,2,3])→trueDate.prototype.isPrototypeOf(new Date())→true -
检查自定义类/构造函数的原型链关系:
function Animal() {}function Dog() {}Dog.prototype = Object.create(Animal.prototype);const dog = new Dog();Animal.prototype.isPrototypeOf(dog)→true -
区分原生对象类型(替代 instanceof 的一种思路):
Promise.prototype.isPrototypeOf(Promise.resolve())→truePromise.prototype.isPrototypeOf({})→false
与 instanceof 的区别
instanceof 检查的是「构造函数的 prototype 是否在实例的原型链上」,而 isPrototypeOf 直接操作原型对象本身,更底层、更灵活。
例如:const obj = Object.create({a: 1});obj instanceof Object → true(因为 Object.prototype 在其原型链上)({a:1}).isPrototypeOf(obj) → true(直接用字面量对象作原型检测)
但 {a:1} 不是构造函数,无法用于 instanceof 左侧,而 isPrototypeOf 支持任意对象作为原型候选。
注意事项
- 参数必须是对象(
null和undefined会抛出TypeError) - 原始值(如字符串、数字)会自动装箱,但需注意隐式转换行为:
String.prototype.isPrototypeOf("hello")→true("hello" 被包装为String实例) - 箭头函数没有
prototype属性,所以ArrowFn.prototype.isPrototypeOf(...)会报错(Cannot read property 'isPrototypeOf' of undefined)

















