isPrototypeOf用于检测一个对象是否在另一对象的原型链中,返回布尔值;调用方必须为对象,参数需为其原型链成员;与instanceof不同,它直接检查原型链,更底层稳定。

isPrototypeOf 是 JavaScript 中用于检测一个对象是否在另一个对象的原型链上的方法。它不判断“是不是构造函数的 prototype”,而是直接检查“这个对象是不是那个对象的原型(或原型链中的一环)”。
基本用法和返回值
语法:prototypeObj.isPrototypeOf(instanceObj)
返回布尔值:
- 如果 prototypeObj 出现在 instanceObj 的原型链中(包括直接原型、间接原型),返回 true;
- 否则返回 false。
注意:
- 调用方必须是对象(不能是原始值,如字符串字面量、数字等);
- 参数可以是任意对象,但只有当它是调用对象的原型链成员时才返回 true。
常见使用场景举例
- 判断某个自定义类的原型是否被实例继承:
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
<p>const dog = new Dog();</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java"><img
src="https://img.php.cn/upload/skill/000/000/081/178955835420587.jpg" alt="Alibabacloud Sdk Client Initialization For Java" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java">Alibabacloud Sdk Client Initialization For Java</a>
<p>在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。</p>
</div>
<a href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p>console.log(Animal.prototype.isPrototypeOf(dog)); // true
console.log(Dog.prototype.isPrototypeOf(dog)); // true
console.log(Object.prototype.isPrototypeOf(dog)); // true(所有对象都继承自 Object.prototype)
- 检查内置对象的原型关系:
const arr = [1, 2, 3]; console.log(Array.prototype.isPrototypeOf(arr)); // true console.log(Object.prototype.isPrototypeOf(arr)); // true console.log(String.prototype.isPrototypeOf(arr)); // false
和 instanceof 的区别
isPrototypeOf 和 instanceof 都用于原型链检测,但角度不同:
立即学习“Java免费学习笔记(深入)”;
-
A.isPrototypeOf(B):从“原型对象 A”出发,问“我是不是 B 的原型?” -
B instanceof A:从“实例 B”出发,问“我是不是由以 A.prototype 为原型的构造函数创建的?”
关键差异:
- instanceof 依赖构造函数的 prototype 属性,如果该属性被改写或丢失,可能失效;
- isPrototypeOf 直接操作原型链,更底层、更稳定,适合在不确定构造函数是否完整时使用。
注意事项和易错点
- 不能对原始值直接调用:
"hello".isPrototypeOf({})会报错("hello"不是对象);需先包装:Object.prototype.isPrototypeOf("hello")是合法的(因为字符串字面量会被临时包装为 String 对象)。 - 箭头函数没有
prototype属性,所以arrowFn.prototype是 undefined,不能用arrowFn.prototype.isPrototypeOf(...)。 - 手动修改
__proto__或用Object.setPrototypeOf()会影响结果,isPrototypeOf反映的是当前实际原型链状态。

















