isprototypeof用于检测一个对象是否在另一对象的原型链中,返回布尔值;调用方必须为对象,参数需为其原型链成员;与instanceof不同,它直接检查原型链,更底层稳定。

isPrototypeOf 是 JavaScript 中用于检测一个对象是否在另一个对象的原型链上的方法。它不判断“是不是构造函数的 prototype”,而是直接检查“这个对象是不是那个对象的原型(或原型链中的一环)”。
基本用法和返回值
语法:prototypeObj.isPrototypeOf(instanceObj)
返回布尔值:
- 如果 prototypeObj 出现在 instanceObj 的原型链中(包括直接原型、间接原型),返回 true;
- 否则返回 false。
注意:
- 调用方必须是对象(不能是原始值,如字符串字面量、数字等);
- 参数可以是任意对象,但只有当它是调用对象的原型链成员时才返回 true。
常见使用场景举例
- 判断某个自定义类的原型是否被实例继承:
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
<p>const dog = new Dog();</p><p>console.log(Animal.prototype.isPrototypeOf(dog)); // true
console.log(Dog.prototype.isPrototypeOf(dog)); // true
console.log(Object.prototype.isPrototypeOf(dog)); // true(所有对象都继承自 Object.prototype)
</p>
- 检查内置对象的原型关系:
const arr = [1, 2, 3]; console.log(Array.prototype.isPrototypeOf(arr)); // true console.log(Object.prototype.isPrototypeOf(arr)); // true console.log(String.prototype.isPrototypeOf(arr)); // false
和 instanceof 的区别
isPrototypeOf 和 instanceof 都用于原型链检测,但角度不同:
-
A.isPrototypeOf(B):从“原型对象 A”出发,问“我是不是 B 的原型?” -
B instanceof A:从“实例 B”出发,问“我是不是由以 A.prototype 为原型的构造函数创建的?”
关键差异:
- instanceof 依赖构造函数的 prototype 属性,如果该属性被改写或丢失,可能失效;
- isPrototypeOf 直接操作原型链,更底层、更稳定,适合在不确定构造函数是否完整时使用。
注意事项和易错点
- 不能对原始值直接调用:
"hello".isPrototypeOf({})会报错("hello"不是对象);需先包装:Object.prototype.isPrototypeOf("hello")是合法的(因为字符串字面量会被临时包装为 String 对象)。 - 箭头函数没有
prototype属性,所以arrowFn.prototype是 undefined,不能用arrowFn.prototype.isPrototypeOf(...)。 - 手动修改
__proto__或用Object.setPrototypeOf()会影响结果,isPrototypeOf反映的是当前实际原型链状态。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











