isPrototypeOf用于检测一个对象是否在另一对象的原型链上,语法为prototypeObj.isPrototypeOf(instanceObj),返回布尔值;它判断原型对象本身是否存在于实例的原型链中,而非类继承关系。

isPrototypeOf 是 JavaScript 中用于检测一个对象是否在另一个对象的原型链上的方法。它不判断“类继承”,而是判断“原型链上的位置关系”——即某个对象是否是目标对象的 原型(prototype)或其上级原型。
基本用法:谁是谁的原型?
语法很简单:prototypeObj.isPrototypeOf(instanceObj),返回布尔值。
- 如果
prototypeObj出现在instanceObj的原型链中(包括直接 prototype 或 Object.getPrototypeOf 链上的任意一环),返回 true; - 否则返回 false。
例如:
const Parent = function() {};const Child = function() {};
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
const childInst = new Child();
console.log(Parent.prototype.isPrototypeOf(childInst)); // true
console.log(Child.prototype.isPrototypeOf(childInst)); // true
console.log(Object.prototype.isPrototypeOf(childInst)); // true(所有对象都继承自 Object.prototype)
和 instanceof 的区别在哪?
isPrototypeOf 检查的是某个对象是否在实例的原型链上;而 instanceof 检查的是实例是否由某个构造函数“创建”,且该构造函数的 prototype 在其原型链上。
-
Parent.prototype.isPrototypeOf(childInst)✅ 关注原型对象本身; -
childInst instanceof Parent✅ 关注构造函数 + 其 prototype 是否在链上; - 二者逻辑高度相关,但主体不同:一个是“对象 vs 实例”,一个是“构造函数 vs 实例”。
常见误用场景提醒
注意这几个典型错误:
- ❌ 不能对非对象类型调用:
null、undefined、原始值(如"abc"、42)会报错; - ❌ 不要混淆
A.isPrototypeOf(B)的方向:是“A 是否在 B 的原型链上”,不是 “B 是否继承自 A” 的文字直译; - ❌ 箭头函数没有
prototype属性,所以arrowFn.prototype.isPrototypeOf(...)会报错(因为arrowFn.prototype是undefined)。
实用技巧:配合 getPrototypeOf 查原型链
想验证整个原型链,可以结合 Object.getPrototypeOf() 手动遍历:
if (proto === null || obj == null) return false;
let current = obj;
while (current) {
if (proto === current) return true;
current = Object.getPrototypeOf(current);
}
return false;
}
这个函数行为和 proto.isPrototypeOf(obj) 一致,但帮你理解底层怎么走链。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











