isPrototypeOf()用于检测原型链关系,调用在潜在原型对象上并传入待检测对象,返回布尔值;它比instanceof更底层灵活,不依赖构造函数,仅检查实际原型链。

isPrototypeOf() 是 JavaScript 中用于检测某个对象是否存在于另一个对象的原型链上的方法。它调用在「潜在的原型对象」上,传入「待检测的对象」作为参数,返回布尔值。
基本用法和语法
语法格式为:
prototypeObject.isPrototypeOf(instanceObject)
其中:
-
prototypeObject 是你怀疑自己“是别人原型”的那个对象(通常是构造函数的
prototype或某个普通对象); -
instanceObject 是你想要检查其原型链中是否包含
prototypeObject</strong> 的那个实例或对象;</li> <li>只要 <code>prototypeObject
出现在instanceObject的原型链中(包括直接原型、间接原型,甚至Object.prototype),就返回true。
常见使用场景示例
✅ 检查构造函数原型是否被继承:
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
const myDog = new Dog();
console.log(Animal.prototype.isPrototypeOf(myDog)); // true
console.log(Dog.prototype.isPrototypeOf(myDog)); // true
console.log(Object.prototype.isPrototypeOf(myDog)); // true
✅ 检查普通对象是否以某对象为原型:
const parent = { name: 'Parent' };
const child = Object.create(parent);
console.log(parent.isPrototypeOf(child)); // true
❌ 注意:不能反过来调用 —— 实例对象上没有 isPrototypeOf 方法来“查自己的原型”,必须由原型对象发起判断:
myDog.isPrototypeOf(Animal.prototype); // TypeError: myDog.isPrototypeOf is not a function
与 instanceof 的区别
isPrototypeOf() 和 instanceof 都能判断原型链关系,但角度不同:
-
instanceof写成obj instanceof Constructor,关注的是「Constructor.prototype是否在obj的原型链上」; -
isPrototypeOf()更底层、更灵活,可直接用任意对象(不一定是函数的prototype)做原型检测; -
instanceof依赖构造函数的prototype属性,而isPrototypeOf()不关心是否是构造函数,只看实际原型链。
注意事项和边界情况
⚠️ 以下情况会返回 false:
- 传入
null或undefined作为参数(会抛出TypeError); - 原型链被显式切断(如重写了
__proto__或用Object.setPrototypeOf(obj, null)); - 检测对象自身就是原型对象(即
obj.isPrototypeOf(obj)),这始终为false,因为原型链从[[Prototype]]开始,不包含自身。
? 小技巧:想快速查看一个对象的整个原型链,可用 Object.getPrototypeOf() 连续调用,或浏览器控制台中展开 __proto__ 查看。

















