instanceof 是最直接判断实例关系的操作符,通过检查对象原型链是否包含构造函数的 prototype 来返回布尔值;但跨 iframe 或原型链被篡改时可能失效,内置类型推荐使用 Array.isArray() 或 Object.prototype.toString.call()。

用 instanceof 操作符是最直接、最常用的方法。
使用 instanceof 判断实例关系
instanceof 会检查对象的原型链上是否存在构造函数的 prototype 对象。
语法很简单:
-
obj instanceof Constructor—— 返回布尔值 - 如果
obj是Constructor或其子类创建的实例,结果为true - 即使经过多层继承,只要原型链中能找到
Constructor.prototype,就返回true
例如:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function Person() {}
const p = new Person();
console.log(p instanceof Person); // true
class Animal {}
const a = new Animal();
console.log(a instanceof Animal); // true
console.log(a instanceof Object); // true(因为 class 默认继承自 Object)
注意原型链被修改时的行为
如果手动改写过构造函数的 prototype,或者用 Object.create(null) 创建对象,instanceof 可能失效。
- 重写
prototype后未修复constructor属性,不影响instanceof判断(它只关心原型链,不看constructor) - 但若把整个原型替换成一个没有关联的普通对象(如
{}),可能导致判断出错 - 用
Object.create(null)创建的对象,原型链终点是null,所以obj instanceof AnyConstructor全为false
替代方案:检查 constructor 属性(不推荐单独使用)
obj.constructor === Constructor 看起来直观,但不可靠:
-
constructor属性可被随意覆盖或删除 - 在继承中,子类实例的
constructor可能指向父类(如果没显式修复) - 箭头函数、内置对象(如数组)可能表现不一致(
[].constructor === Array虽成立,但不具普适性)
所以仅作辅助参考,不能替代 instanceof。
对内置类型,优先用更专用的方法
比如判断数组、日期、正则等,建议用 Array.isArray()、Object.prototype.toString.call() 等更健壮的方式:
-
Array.isArray([])比[] instanceof Array更安全(尤其跨 iframe 时) -
Object.prototype.toString.call(new Date()) === '[object Date]'可准确识别所有内置对象类型 - 这是因为
instanceof在跨执行上下文(如不同 iframe)中会失败,而toString方法不会

















