isprototypeof用于判断一个对象是否在另一对象的原型链上,语法为prototypeobj.isprototypeof(instanceobj),返回布尔值;左侧必须是对象,右侧可为任意值,但原始值需通过包装对象调用才有效。

isPrototypeOf 是 JavaScript 中用于判断一个对象是否在另一个对象的原型链上的方法。它不检查构造函数,也不依赖 instanceof 的机制,而是直接检测「某个对象是否出现在目标对象的原型链中」。
基本用法和语法
语法很简单:
prototypeObj.isPrototypeOf(instanceObj)- 返回布尔值:
true表示prototypeObj在instanceObj的原型链上;否则为false -
prototypeObj必须是对象(不能是原始值),instanceObj可以是任意值(但通常也是对象)
常见验证场景
✅ 验证普通构造函数的原型关系:
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
const dog = new Dog();
console.log(Animal.prototype.isPrototypeOf(dog)); // true
console.log(Dog.prototype.isPrototypeOf(dog)); // true
console.log(Object.prototype.isPrototypeOf(dog)); // true(所有对象都继承自 Object.prototype)
✅ 验证 Object.create 创建的对象:
const parent = { a: 1 };
const child = Object.create(parent);
console.log(parent.isPrototypeOf(child)); // true
console.log(Object.prototype.isPrototypeOf(child)); // true
❌ 注意:不能对原始值调用(会报错):
{}.isPrototypeOf(42); // TypeError: {}.isPrototypeOf is not a function
// 正确写法是先确保左边是对象:
Object.prototype.isPrototypeOf(42); // true(因为 42 被包装为 Number 实例,其原型链包含 Object.prototype)
和 instanceof 的区别
isPrototypeOf 和 instanceof 都检测原型链,但角度不同:
-
A.isPrototypeOf(B):问「A 是否在 B 的原型链上?」——从原型出发,查实例 -
B instanceof A:问「B 是否是 A 构造出来的实例?」——从实例出发,查构造函数的prototype - 本质等价于:
A.prototype.isPrototypeOf(B)(前提是 A 有 prototype 属性且是函数)
实用小技巧
✅ 检查内置对象的原型归属(比如确认是否为数组):
console.log(Array.prototype.isPrototypeOf([])); // true
console.log(Array.prototype.isPrototypeOf({})); // false
console.log(Object.prototype.isPrototypeOf(null)); // false(null 没有原型链)
console.log(Object.prototype.isPrototypeOf(undefined)); // false
✅ 安全检测(避免报错):
function safeIsProto(proto, obj) {
return proto && typeof proto === 'object' &&
obj != null &&
proto.isPrototypeOf(obj);
}
不复杂但容易忽略细节:它只关心原型链是否存在引用路径,不关心中间有没有被修改或代理拦截(Proxy 不影响原型链本身)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











