一、概述
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,以及判断基本类型时的局限性。