您的位置:

JavaScript instanceof 运算符

一、概述

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

function Foo() {}
function Bar() {}

let foo = new Foo()

console.log(foo instanceof Foo) // true
console.log(foo instanceof Bar) // false

在上面的例子中,由于 foo 的原型链中出现了 Foo.prototype,因此 foo instanceof Foo 的结果是 true。

需要注意的是,instanceof 判断的是实例的原型链上是否出现过该构造函数的 prototype 属性,而不是判断实例本身是否为该构造函数。

二、使用

instanceof 运算符通常用于判断某个对象是否为某种类型。

function People(name, age) {
  this.name = name
  this.age = age
}

function Student(name, age, grade) {
  this.name = name
  this.age = age
  this.grade = grade
}

let john = new People('John', 20)
let mary = new Student('Mary', 18, '高中三年级')

console.log(john instanceof People) // true
console.log(mary instanceof Student) // true
console.log(mary instanceof People) // true

在上面的例子中,即使 Student 没有明确继承 People,但是由于 Student 的原型链中包含了 People.prototype,所以可以判断 mary instanceof People 为 true。

三、注意事项

在使用 instanceof 运算符时,需要注意以下几点:

1. instanceof 右侧必须是一个函数。

2. instanceof 运算符不能正确判断基本类型,因为基本类型不是对象。

console.log('hello' instanceof String) // false
console.log(123 instanceof Number) // false

3. instanceof 可能被修改,导致结果不是预期的。

function Foo() {}
function Bar() {}

Bar.prototype = new Foo()

let b = new Bar()

console.log(b instanceof Bar) // true
console.log(b instanceof Foo) // true

// 修改 Bar.prototype
Bar.prototype = {}

console.log(b instanceof Bar) // false
console.log(b instanceof Foo) // true,由于对象 b 的原型链没有发生改变

四、总结

JavaScript 的 instanceof 运算符是一种用于判断对象是否属于某个类型的工具。它的判断方式是检测对象的原型链中是否出现了某个构造函数的 prototype 属性。在使用过程中需要注意避免修改构造函数的 prototype,以及判断基本类型时的局限性。