JavaScript: instanceof

79 阅读1分钟

在 JavaScript 中,instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。这是一种检查对象是否为特定类型(即由特定构造函数创建)的常用方法。

  基本用法

function Car(make, model) {
    this.make = make;
    this.model = model;
}

const myCar = new Car('Honda', 'Civic');

console.log(myCar instanceof Car); // 输出:true
console.log(myCar instanceof Object); // 输出:true

  在这个例子中,myCarCar 类型的实例,所以 myCar instanceof Car 返回 true。同时,由于所有的 JavaScript 对象都是 Object 的实例,myCar instanceof Object 也返回 true

  原理

  instanceof 检查整个原型链,因此一个对象可能是多个构造函数的实例:

  • 当你使用 instanceof 时,它会检查右侧构造函数的 prototype 是否存在于左侧对象的原型链上。
  • 每个对象都有一个 __proto__ 属性(非标准,但在大多数浏览器中实现了),指向它的构造函数的原型对象。
  • 这个链会一直向上查找,直到找到对应的原型,或者到达原型链的顶端(Object.prototype.__proto__,其值为 null)。

  注意事项

  1. 对于原始类型的限制:由于原始类型(如 stringnumberboolean)不是对象,直接对它们使用 instanceof 会返回 false
console.log(3 instanceof Number); // 输出:false

  2. 自定义对象和类instanceof 对自定义对象和 ES6 类同样有效。

class Animal {}
class Dog extends Animal {}

const myDog = new Dog();
console.log(myDog instanceof Dog); // 输出:true
console.log(myDog instanceof Animal); // 输出:true

  3. 函数的特殊情况: 在 JavaScript 中,函数是 Function 的实例,同时也是 Object 的实例。

function myFunction() {}
console.log(myFunction instanceof Function); // 输出:true
console.log(myFunction instanceof Object); // 输出:true

  instanceof 是一种强大且常用的类型检查工具,特别是在处理多态性或需要确定对象是否兼容特定接口的场景中。