前言
本文涉及知识点包括原型链相关知识等
原理
以左代表传入的实例对象,右代表传入的构造函数,方便理解
instanceof 底层原理就是通过判断左边的原型对象是否与右边的原型对象相等,从而判断左是不是右的实例成员
举例
定义一个数组,通过官方的instanceof关键字来作例子,判断当前的数组是否属于Array的实例成员
再来看看arr的原型对象以及Array的原型对象
手写instanceof函数
由上图可以看出,能充分证明开头说的原理是没有问题的,那既然如此,我们就可以开始手写instanceof函数了,老规矩left代表实例对象,right代表构造函数
function Myinstanceof(left,right){
//获取left的原型对象和right的原型对象作对比
left = left.__proto__;
right = right.prototype;
//循环遍历一直沿着原型链往上找left的原型对象并作对比,当left原型对象为null时则结束
while(true){
if(left === null)return false;
if(left===right) return true;
left=left.__proto__;
}
}
至此,instanceof函数就写完了,下面进行测试
成功测试
// 定义一个类
class Test {}
// new一个实例对象出来
const test = new Test()
console.log(Myinstanceof(test,Test)); //true
失败测试
// 定义一个类
class Test {}
// new一个实例对象出来
const test = new Date()
console.log(Myinstanceof(test,Test)); //false
结束
至此,整个手写instanceof函数就完毕啦,有什么错误之处希望各位前端大佬指点指点