JavaScript instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。(MDN)

instanceof 是另一种检测类型的手段,但通常用于检测对象之间的关系,如某个对象是不是由某个构造函数生成的。

function Person(name) {
  this.name = name;
}

var person = new Person('小明');

console.log(
  person instanceof Person,
); // 输出:true

1. 语法

对象 instanceof 构造函数;

虽然语法是这样的,其实左侧可以是任意数据类型,但右侧必须是一个函数。

否则会报如下错误:

[] instanceof {};

// Uncaught TypeError: Right-hand side of 'instanceof' is not callable

错误大致意思是 instanceof 的右操作数不能被调用。

JavaScript ,可被调用的目前只有函数。

2. 注意点

使用 instanceof 检测的时候,不一定只有一个为 true 的结果。

function Person(name) {
  this.name = name;
}

var person = new Person('小明');

console.log(
  person instanceof Person,
  person instanceof Object,
); // 输出:true

因为 instanceof 实际上是去左操作数的原型链上寻找有没有右操作数的原型

person 的原型链上既匹配到 Person.prototype 又能匹配到 Object.prototype,所以都能返回 true

使用的时候要注意这个问题,如判断某个对象的原型链上是否有 Object.prototype 的时候,要考虑到一些其他对象。

[] instanceof Object; // true

数组的原型链上也是有 Object.prototype 的,所以做一些检测的时候要考虑一些特殊情况。

3. 小结

instanceof 可以用来检测对象和构造函数之间的关系,其检测的原理是左操作数的原型上是否有右操作数的 prototype 属性,所以要注意一些检测的特殊情况。