一、作用
instanceof是Javascript 中的一个操作符,用于检测构造函数的”prototype“属性是否出现在某个实例对象的原型链中的任何位置。
二、原理
instanceof的原理基于对象的原型链来进行判断。它接受两个参数:要检查的对象和要检查的构造函数或类。
- instanceof 首先检查对象的原型链,这个原型链包括对象的直接原型、原型的原型等,形成一个链式结构。
- 然后,instanceof 检查原型链上是否存在指定的构造函数或类。如果在原型链上找到了这个构造函数,就返回 true,表示对象是该构造函数的实例;如果没有找到,就返回 false。
总结就是不断遍历左边变量的原型链,并不断判断右边变量是否在左边变量的原型链上,如果查找失败,则返回false,表示左边变量不是右边变量的实例对象
三、手写原理实现代码
代码如下(示例):
function myInstanceof(leftVal, rightVal) {
let L = leftVal.__proto__
const R = rightVal.prototype
while (true) {
if (L === null) {
return false;
}
if(L === R) {
return true;
}
L= L.__proto__;
}
}
function A() {
this.name = 'test';
}
const a= new A();
const b = {
name:'test'
}
const res1 = myInstanceof(a,A)
const res2 = myInstanceof(b,A)
console.log(res1,res2) // true, false
四、延伸和总结
实际上,instanceof 会不断向上遍历对象的原型链,直到找到指定的构造函数或达到原型链的末端。如果找到匹配的构造函数,就返回 true,否则返回 false。
在 JavaScript中,每个实例对象都有一个内置的隐式原型属性 proto,这个属性指向其构造函数的原型对象 prototype。构造函数本身也是一个对象,它也有自己的 proto 属性指向更上一层的原型对象。只有 Object.prototype.proto 在未修改的情况下为 null,表示 null 为原型链的末端。通过 proto 连接起来的每一个对象构成了原型链。
总结来说,instanceof 操作符通过检查对象的原型链来确定一个对象是否属于某个特定的构造函数或类。
五、使用场景以及与typeof的区别
-
判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例
代码如下(示例):const arr = [] arr instanceof Array // true function A(name){ this.name =name } const a = new A('test') a instanceof A // true
-
与typeof的区别
const arr = [] arr instanceof Array // true typeof arr // 'object'
总结: typeof 在对值类型number、string、boolean 、undefined、以及引用类型的function的反应是精准的;但是,对于对象{ } 、数组[ ] 、null 都会返回 object,但对 NaN 返回的是number类型
为了弥补这一点,instanceof 从原型的角度,来判断某引用属于哪个构造函数,从而判定它的数据类型。