手写instanceof

682 阅读1分钟
  • 前言

instanceof在我们进行类型判断过程中是极其常见的,和typeof配合使用便可以完成js中绝大部分数据类型的判断。但是你有没有想过,instanceof的底层是如何实现的呢? 今天就让我们一起手撕JS源码,实现手写instanceof!

想要实现手写instanceof,就要理解,instanceof的底层核心——沿着原型链向上查找,检查目标对象的原型链中是否有与指定对象的原型相同的原型!

  • 手撕代码
function myInstanceof(left, right) { //left为目标对象,right为指定对象
    // 基本数据类型直接返回false
    if (typeof left !== 'object' || left === null) {
        return false;
    }
    // 非基础数据类型开始实现沿着原型链向上查找
    // 获取当前原型链
    let proto = Object.getPrototypeOf(left);
    // 使用死循环进行原型链爬升
    while (true) {
        // 原型链的顶部是null,如果走到这,说明不存在相同的原型
        if (proto === null) {
            return false;
        }
        // 存在相同的原型,说明是目标对象的实例,返回true
        if (proto === right.prototype) {
            return true;
        }
        // 实现原型链爬升
        proto = Object.getPrototypeOf(proto);
    }
}

// 使用简单数据类型测试
console.log(myInstanceof(111, Number));  // false
// 使用复杂数据类型
console.log(myInstanceof(new Number(111), Number)); // true
  • 写在最后

在JS的学习中,我们不应该仅仅学习各种API,更应该深入学习JS的底层,了解其工作原理,将JS进行更加彻底的学习!

我是江河,前端实习生一枚,欢迎各位大佬滴滴,文章如有不正之处敬请斧正!