isPrototypeOf用于判断某对象是否在另一对象的原型链上,语法为prototypeObj.isPrototypeOf(instanceObj),返回布尔值;它与instanceof功能相似但角度不同,前者检查原型关系,后者检查构造函数实例关系。

isPrototypeOf 是 JavaScript 中用于判断某个对象是否出现在另一个对象的原型链上的方法。它属于所有对象都继承自 Object.prototype 的内置方法,调用时返回布尔值。
基本用法和语法
语法格式为:prototypeObj.isPrototypeOf(instanceObj),其中:
-
prototypeObj是你怀疑“在原型链上”的那个对象(通常是构造函数的prototype) -
instanceObj是你要检查的对象(通常是实例) - 如果
prototypeObj出现在instanceObj的原型链中(包括直接或间接的[[Prototype]]),返回true;否则返回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.prototype)
和 instanceof 的区别
isPrototypeOf 和 instanceof 功能相似,但角度不同:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
instanceof检查的是「实例是否由某构造函数创建」,即obj instanceof Constructor -
isPrototypeOf检查的是「某对象是否是另一对象的原型」,即Constructor.prototype.isPrototypeOf(obj)
实际上,obj instanceof Ctor 在内部就等价于 Ctor.prototype.isPrototypeOf(obj)(忽略 Symbol.hasInstance 自定义逻辑)。
常见使用场景
适合在需要显式检查原型关系、不依赖构造函数名、或处理动态/匿名原型链时使用:
- 校验第三方库返回的对象是否继承自预期原型(如某些框架的基类)
- 在 polyfill 或兼容性代码中安全地检测原型链(比直接访问
__proto__更标准) - 配合
Object.getPrototypeOf()遍历原型链时做条件判断
注意:不能用 null 或 undefined 调用该方法,会报错;必须确保左侧是对象。
容易出错的地方
几个典型误区:
- 把参数顺序弄反:写成
myDog.isPrototypeOf(Animal.prototype)❌(应是原型对象调用,不是实例调用) - 对原始值使用:如
{}.constructor.prototype.isPrototypeOf("hello")❌(字符串字面量不是对象实例,但包装对象除外) - 混淆
isPrototypeOf和hasOwnProperty:后者检查自身属性,与原型链无关
安全做法是先用 typeof obj === 'object' && obj !== null 判断有效性再调用。

















