instanceof通过沿obj.__proto__向上遍历原型链,查找是否等于constructor.prototype来判断继承关系;匹配则返回true,达null未找到则返回false,支持内置类型、自定义类及继承判断,但受原型修改和跨iframe影响。

instanceof 通过检查对象的原型链中是否包含构造函数的 prototype 来判断继承关系。
instanceof 的底层原理
当执行 obj instanceof Constructor 时,JavaScript 引擎会沿着 obj.__proto__ 一路向上查找,看能否找到 Constructor.prototype。只要在原型链中某一级匹配成功,就返回 true。
- 查找从
obj自身的[[Prototype]](即obj.__proto__)开始 - 每次比较当前对象是否严格等于
Constructor.prototype - 如果相等,返回
true;如果不等且还有上一级原型,继续向上查;到null还没找到,返回false
常见使用场景与示例
判断内置类型或自定义类的实例归属:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
[] instanceof Array→true(数组原型链含Array.prototype) -
new Date() instanceof Date→true -
function foo(){} instanceof Function→true - 若
B继承A:class B extends A {},则new B() instanceof A也是true
需要注意的边界情况
原型链被修改或跨执行上下文时,instanceof 可能失效:
- 手动改写
obj.__proto__或Constructor.prototype会影响结果 - iframe 中创建的对象,其构造函数和当前页面的构造函数不是同一个引用,
instanceof会返回false(例如 iframe 里的数组arr instanceof Array为false) - 用
Object.create(null)创建的对象没有原型,任何instanceof都是false
替代方案与补充建议
当 instanceof 不可靠时,可结合其他方式验证:
- 用
Object.prototype.toString.call(obj)获取内部标签,如[object Array] - 检查对象是否有特定方法或属性(鸭子类型),适用于松散判断
- ES6 起推荐优先使用
class和extends,让原型链更清晰、更易预测
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










