在 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
在这个例子中,myCar 是 Car 类型的实例,所以 myCar instanceof Car 返回 true。同时,由于所有的 JavaScript 对象都是 Object 的实例,myCar instanceof Object 也返回 true。
原理
instanceof 检查整个原型链,因此一个对象可能是多个构造函数的实例:
- 当你使用
instanceof时,它会检查右侧构造函数的prototype是否存在于左侧对象的原型链上。 - 每个对象都有一个
__proto__属性(非标准,但在大多数浏览器中实现了),指向它的构造函数的原型对象。 - 这个链会一直向上查找,直到找到对应的原型,或者到达原型链的顶端(
Object.prototype.__proto__,其值为null)。
注意事项
- 对于原始类型的限制:由于原始类型(如
string、number、boolean)不是对象,直接对它们使用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 是一种强大且常用的类型检查工具,特别是在处理多态性或需要确定对象是否兼容特定接口的场景中。