isprototypeof()用于检测一个对象是否存在于另一对象的原型链中,返回布尔值;语法为prototypeobj.isprototypeof(instanceobj),与instanceof不同,它直接检查对象而非构造函数,适用于object.create()等非构造函数创建的对象。

isPrototypeOf 是 JavaScript 中用于检测一个对象是否在另一个对象的原型链上的方法。它不判断“是不是直接原型”,而是看“有没有出现在原型链中”,只要中间经过它,就返回 true。
基本用法和语法
调用方式:prototypeObj.isPrototypeOf(instanceObj),其中:
-
prototypeObj是你怀疑“在原型链上”的那个对象(通常是构造函数的prototype) -
instanceObj是你要检查的对象(通常是实例) - 返回布尔值:
true表示prototypeObj出现在instanceObj的原型链中;否则为false
例如:
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)
和 instanceof 的区别
isPrototypeOf 和 instanceof 都检测原型链,但角度不同:
-
instanceof检查的是“实例是否由某个构造函数创建”,内部依赖构造函数的prototype属性 -
isPrototypeOf更底层,直接拿一个对象去问:“你是不是这个实例的原型链一员?”不涉及构造函数本身 -
instanceof无法检测纯对象字面量或未通过构造函数创建的对象的原型归属,而isPrototypeOf可以
比如:
const obj = Object.create({ a: 1 });
console.log({ a: 1 }.isPrototypeOf(obj)); // true
console.log(obj instanceof ???); // 没有构造函数,没法写 instanceof(除非手动设 constructor)
常见易错点
注意这几个典型误区:
- 不能对
null或undefined调用,会报TypeError - 必须是对象才能调用(基本类型会自动包装,但原始值如
42、'abc'本身没有原型链,包装后才可查) -
Array.prototype.isPrototypeOf([1,2])返回true,但[].isPrototypeOf([1,2])是false—— 因为[]是新对象,不在目标对象的原型链上 - 箭头函数没有
prototype,所以arrowFn.prototype.isPrototypeOf(...)会报错
实际使用建议
当你需要做以下事情时,优先考虑 isPrototypeOf:
- 判断某个自定义原型对象是否被某对象继承(尤其在类库或 mixin 场景中)
- 做跨框架或动态原型链检查(比如插件系统中验证对象是否符合某协议)
- 替代
instanceof处理非构造函数创建的对象(如Object.create()、Object.setPrototypeOf()创建的) - 配合
Object.getPrototypeOf()一起调试原型链结构
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











