object.isprototypeof用于判断某对象是否为另一对象的原型,语法为prototypeobj.isprototypeof(instanceobj),返回布尔值;它直接检测原型链关系,不依赖构造函数,比instanceof更底层精确。

Object.isPrototypeOf 是 JavaScript 中专门用于判断某个对象是否为另一对象的原型的方法,它比 instanceof 更底层、更精确,不依赖构造函数,直接检测原型链上的直接或间接关系。
核心用法:明确谁是“原型”,谁是“实例”
语法是:prototypeObj.isPrototypeOf(instanceObj)。注意顺序:**左边是疑似原型对象,右边是待检测的对象**。返回布尔值。
- 如果
instanceObj的原型链中包含prototypeObj(即prototypeObj === instanceObj.__proto__或向上递归能找到),返回true - 否则返回
false - 若
instanceObj不是对象(如null、undefined、原始值),会抛出TypeError
和 instanceof 的关键区别
instanceof 检查的是“实例是否由某构造函数创建”,内部调用的是构造函数的 prototype 属性;而 Object.isPrototypeOf 直接比较两个对象,不涉及函数或 prototype 属性名。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Array.prototype.isPrototypeOf([1,2])→true(数组原型确实在其原型链上) -
[1,2] instanceof Array→true(等价但机制不同) -
Array.prototype.isPrototypeOf([])→true,但[] instanceof Function→false,而Function.prototype.isPrototypeOf([])→true(因为Array.prototype继承自Function.prototype)
实用判断场景
适合在不依赖构造函数名、或对象未通过 new 创建时验证原型归属:
- 检测一个对象是否继承自某个自定义原型对象:
const parent = { say() { return 'hi'; } };<br> const child = Object.create(parent);<br> parent.isPrototypeOf(child); // true - 安全检查内置原型(避免因污染或重写
constructor导致误判):Object.prototype.isPrototypeOf({}); // true<br> Object.prototype.isPrototypeOf(Object.create(null)); // false(无原型) - 配合
Object.getPrototypeOf追溯链:const obj = {};<br> Object.prototype.isPrototypeOf(obj) && Object.getPrototypeOf(obj) === Object.prototype; // true
注意事项与常见误区
容易出错的地方集中在类型和顺序:
- 不能对原始值调用:
Object.prototype.isPrototypeOf('hello')→ 报错;需先装箱:Object.prototype.isPrototypeOf(Object('hello'))→true - 顺序反了会得到错误结果:
{}.__proto__.isPrototypeOf(Object.prototype)是false,因为Object.prototype在更上层 -
Object.isPrototypeOf(obj)是无效写法——Object是函数,它的prototype是供其实例使用的,不是通用原型;应写成Object.prototype.isPrototypeOf(obj)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










