Object.isPrototypeOf用于检测一个对象是否在另一对象的原型链中,返回布尔值;只接受对象作左侧调用者,原始值会报错或不生效。

Object.isPrototypeOf 是 JavaScript 中用于检测一个对象是否存在于另一个对象的原型链上的方法。它不关心属性或值,只判断“某对象是否是另一对象的原型(或原型链中的一环)”。
基本用法和返回值
语法: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();
这时可这样验证:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
Dog.prototype.isPrototypeOf(myDog)→true(直接原型) -
Animal.prototype.isPrototypeOf(myDog)→true(间接原型,在原型链上) -
Object.prototype.isPrototypeOf(myDog)→true(所有对象最终都继承自它) -
Array.prototype.isPrototypeOf(myDog)→false
验证 class 继承中的原型链
ES6 class 本质仍是基于原型的,isPrototypeOf 同样适用:
class Vehicle {}
class Car extends Vehicle {}
const car = new Car();
验证方式一致:
-
Car.prototype.isPrototypeOf(car)→true -
Vehicle.prototype.isPrototypeOf(car)→true -
Object.getPrototypeOf(Car.prototype) === Vehicle.prototype为true,说明原型链确实连通
注意点和常见误区
这个方法只接受对象作为左侧调用者,不能是原始值:
-
{}.isPrototypeOf({})✅ 可以(空对象是对象) -
Object.prototype.isPrototypeOf([])✅ 数组也继承自Object.prototype -
null.isPrototypeOf(obj)❌ 报错:Cannot read property 'isPrototypeOf' of null -
String.prototype.isPrototypeOf("hello")❌ 原始字符串不是对象,不会自动包装后走原型链检测("hello"是 primitive,不是String实例);但new String("hello").isPrototypeOf(...)可以
如果想检测原始值的“隐式原型链”,需先转为对应包装对象再取其 prototype,但通常不推荐这么做——语义已偏离设计初衷。

















