isPrototypeOf用于检测一个对象是否在另一对象的原型链中,返回布尔值;语法为prototypeObj.isPrototypeOf(instanceObj),要求prototypeObj为对象且instanceObj为对象实例,否则抛错。

isPrototypeOf 是 JavaScript 中用于检测一个对象是否在另一个对象的原型链上的方法,它不判断直接继承,而是检查整个原型链中是否存在指定对象。
基本用法和返回值
语法为:prototypeObj.isPrototypeOf(instanceObj),其中 prototypeObj 是待检测的原型对象,instanceObj 是待检测的实例对象。只要 instanceObj 的原型链中包含 prototypeObj(即 prototypeObj === instanceObj.__proto__ 或更上层的 __proto__),就返回 true,否则返回 false。
- 只能由函数的
prototype对象或普通对象调用,不能由原始值调用 - 如果传入非对象(如
null、undefined、字符串字面量等),会抛出TypeError - 与
instanceof功能相似但角度相反:A.isPrototypeOf(B)等价于B instanceof A.constructor(前提是A是构造函数的prototype)
常见使用场景示例
判断自定义类或构造函数的原型是否被某个实例继承:
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(所有对象都继承自 Object.prototype)
- 可用于多层继承链验证,比如确认
myDog同时是Dog和Animal的实例 - 配合
Object.getPrototypeOf()可逐级向上检查原型关系 - 在编写工具函数(如深克隆、类型校验)时,比
instanceof更灵活,因为它不依赖构造函数名,只关注原型对象本身
注意点和易错情况
isPrototypeOf 不关心构造函数是否被修改,只看当前原型链结构:
立即学习“Java免费学习笔记(深入)”;
- 如果重写了
Dog.prototype,但没用Object.create(Animal.prototype),那么Animal.prototype.isPrototypeOf(myDog)就是false -
Object.create(null)创建的对象没有原型,所以任何.isPrototypeOf()调用都会返回false - 箭头函数没有
prototype属性,因此不能用其prototype做isPrototypeOf检测 - 不要混淆
obj.isPrototypeOf(another)和obj.prototype.isPrototypeOf(another)—— 前者只有当obj本身就是原型对象时才合理
与 instanceof 的对比理解
二者本质目标一致,但参数角色互换:
-
obj instanceof Constructor→ 检查Constructor.prototype是否在obj的原型链中 -
Constructor.prototype.isPrototypeOf(obj)→ 效果完全相同,只是写法更底层、更明确 -
instanceof内部就是通过遍历原型链调用isPrototypeOf实现的 - 当构造函数不可访问(如闭包内定义、模块未导出),但原型对象可获取时,
isPrototypeOf是唯一选择


















