关键词:instanceof原理、instanceof实现、instanceof手写
instanceof 运算符用于检测一个对象是否是某个构造函数的实例。其作用是判断一个对象是否属于某个类(或其父类)的实例,类似于类的继承关系,如果是则返回 true,否则返回 false。通常情况下,用于判断一个对象的类型或类别。可以结合构造函数和原型链来理解。
示例代码:
function Person(name) {
this.name = name;
}
const person = new Person("张三");
console.log(person instanceof Person); // Output: true
console.log(person instanceof Object); // Output: true
console.log(person instanceof Array); // Output: false
在上面的示例中,我们通过 new
关键字创建了一个 Person 类的实例 person
。然后我们使用 instanceof
运算符检测 person
对象是否是 Person
类的实例,结果为 true。同样地,我们也可以检测 person
对象是否是 Object
类的实例,结果也为 true,因为 Person
类是 Object
类的子类。而 Array
类则是 Object
类的子类,但不是 Person
类的子类,因此检测 person
对象是否是 Array
类的实例,结果为 false。
手写实现
instanceof 运算符用于检测一个对象是否是某个构造函数的实例。可以通过以下方式手写实现 instanceof 运算符。
function myInstanceof(obj, constructor) {
let proto = Object.getPrototypeOf(obj);
while(proto) {
if(proto === constructor.prototype) {
return true;
}
proto = Object.getPrototypeOf(proto);
}
return false;
}
// Example usage
const arr = [1, 2, 3];
console.log(myInstanceof(arr, Array)); // Output: true
console.log(myInstanceof(arr, Object)); // Output: true
console.log(myInstanceof(arr, RegExp)); // Output: false
该实现方式获取传入对象的原型对象,并逐层向上搜索其原型链,直到找到目标构造函数的原型对象或者原型链到达最顶层 Object.prototype。如果找到目标构造函数的原型对象,则返回 true,否则返回 false。