instanceof实现原理以及作用

一、作用

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 从原型的角度,来判断某引用属于哪个构造函数,从而判定它的数据类型。

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值