instanceof 检测对象原型链是否包含构造函数的 prototype 对象,通过沿 [[prototype]] 向上遍历比对引用相等性;支持 class 继承、跨构造器识别,但不适用于原始值、iframe 跨境及替代 array.isarray() 等专用判断。

instanceof 检测的是对象的原型链上是否包含构造函数的 prototype 对象。
核心机制:原型链查找
当执行 obj instanceof Constructor 时,JavaScript 引擎会沿着 obj 的内部属性 [[Prototype]](即 __proto__)向上遍历原型链,逐个比对每个原型对象是否严格等于 Constructor.prototype。一旦匹配成功就返回 true;若查到原型链顶端(null)仍未找到,则返回 false。
- 这个过程不关心类名、字符串标识或构造函数体,只认原型对象的引用相等性
- 即使重写了
Constructor.prototype,只要新原型被正确赋值给实例的__proto__(如通过Object.setPrototypeOf()或class语法自动处理),检测仍有效 - 箭头函数、普通函数、class 声明的构造器,只要满足原型链条件,都可被
instanceof正确识别
继承场景下的行为
在 ES6 class 继承中(class B extends A),JavaScript 自动设置:B.prototype.__proto__ === A.prototype。因此:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 实例
new B()的原型链为:B.prototype → A.prototype → Object.prototype → null - 所以
new B() instanceof B、new B() instanceof A、new B() instanceof Object全为true - 若手动破坏原型链(如直接赋值
B.prototype = {}且未设置__proto__),则继承关系丢失,instanceof A将返回false
常见误区与限制
instanceof 不是万能类型判断工具,有明确边界:
- 跨执行上下文(如 iframe)失效:不同 iframe 中的
Array构造函数互不相等,iframe.contentWindow.Array !== Array,导致arr instanceof Array在父窗口中返回false - 无法识别原始值:
5 instanceof Number是false,因为5是原始类型,没有原型链(装箱后才可检测,但不会自动发生) - 不能替代
typeof或Array.isArray()等专用判断:对数组建议用Array.isArray(),对 null/undefined 用严格相等,对基本类型优先用typeof
手动模拟 instanceof 行为
可用以下逻辑理解其底层流程:
function myInstanceof(obj, constructor) {
if (obj == null || typeof obj !== 'object') return false;
let proto = Object.getPrototypeOf(obj);
while (proto !== null) {
if (proto === constructor.prototype) return true;
proto = Object.getPrototypeOf(proto);
}
return false;
}
该函数复现了标准行为:从对象自身原型开始,逐级向上比对,不依赖构造函数调用痕迹,只依赖原型链结构本身。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










