instanceof 通过检查左侧对象原型链上是否存在右侧构造函数的 prototype 来判断;从 a.__proto__ 开始逐级向上比对,若相等则返回 true,到 null 仍未匹配则返回 false。

instanceof 通过检查左侧对象的原型链上是否存在右侧构造函数的 prototype 对象来判断。
核心逻辑:沿着 __proto__ 向上查找
当执行 a instanceof B 时,JavaScript 引擎会:
- 获取
B.prototype(注意:是构造函数的prototype属性,不是实例的) - 从
a的__proto__开始,逐级向上遍历原型链(即每次取当前对象的__proto__) - 如果某一级的
__proto__严格等于B.prototype,返回true - 如果查到原型链顶端(
null)都没匹配上,返回false
实际例子看原型链匹配过程
比如:
function Person() {}
const p = new Person();
console.log(p instanceof Person); // true
这个判断等价于:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
p.__proto__ === Person.prototype?→ 是,直接返回true
再看继承场景:
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
const d = new Dog();
console.log(d instanceof Dog); // true(d.__proto__ === Dog.prototype)
console.log(d instanceof Animal); // true(d.__proto__.__proto__ === Animal.prototype)
注意几个关键细节
这些容易出错的地方会影响判断结果:
-
instanceof检查的是 构造函数的prototype,不是构造函数本身 - 修改了原型链(如重写
Dog.prototype)后,必须确保新原型的constructor和__proto__关系正确,否则链会断 - 原始值(
string、number等)用instanceof总是false,因为它们没有原型链(装箱对象除外) - 跨执行上下文(如 iframe)时,不同环境中的
Array.prototype不相等,arr instanceof Array可能为false
替代方案与适用场景
如果只需要判断类型,更可靠的方式是:
-
Array.isArray()判断数组 -
Object.prototype.toString.call(x)获取精确类型字符串 -
x.constructor === Y(但constructor可被改写,不完全可靠)
而 instanceof 最适合用于确认一个对象是否由某个类(或构造函数)及其子类创建,尤其在多态和继承判断中很实用。

















