isprototypeof用于检测一个对象是否在另一对象的原型链上,调用格式为obj.isprototypeof(target),返回true表示obj存在于target的原型链中,且必须由对象而非null/undefined调用。

isPrototypeOf 用于检测某个对象是否在另一个对象的原型链上,即判断前者是否为后者的“原型祖先”。
核心用法:obj.isPrototypeOf(target)
调用者 obj 是待检查的原型对象,target 是待检查的实例或对象。返回 true 表示 obj 出现在 target 的原型链中(包括直接 prototype 或更上层)。
- 必须是对象调用,不能是 null/undefined
- 只认原型链上的对象引用,不认构造函数名或类型名
- 即使中间隔了多层(如 A → B → C → 实例),只要链路存在就返回 true
常见检查场景
比如有一个构造函数 Animal 和继承它的 Dog:
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
const myDog = new Dog();
-
Animal.prototype.isPrototypeOf(myDog)→ true(Animal.prototype 在 myDog 原型链上) -
Dog.prototype.isPrototypeOf(myDog)→ true(直接原型) -
Object.prototype.isPrototypeOf(myDog)→ true(所有对象最终都连到 Object.prototype) -
Array.prototype.isPrototypeOf(myDog)→ false(没关联)
和 instanceof 的区别
instanceof 检查的是构造函数(右侧)的 prototype 是否在左侧对象的原型链上;isPrototypeOf 直接拿一个对象(不是函数)去查它是否在目标对象的原型链上。
-
myDog instanceof Dog等价于Dog.prototype.isPrototypeOf(myDog) - 但
myDog instanceof Animal对应的是Animal.prototype.isPrototypeOf(myDog),不是Animal.isPrototypeOf(...)(Animal 是函数,不是原型对象)
注意边界情况
空对象字面量 {} 的原型是 Object.prototype,所以:
-
Object.prototype.isPrototypeOf({})→ true -
{}.isPrototypeOf({})→ 报错({} 是新对象,不能作为方法调用者) -
Object.isPrototypeOf({})→ false(Object 是函数,其本身不在 {} 的原型链上)
要检查某对象是否“源自”某个原型,确保调用者是那个原型对象本身,而不是构造函数或随意创建的实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











