手写一个instanceOf

4,740

前言

最近在看一些JavaScript的手写代码,近期可能会时不时的放出来混经验,还望大家多多关照,让我在掘(mo)金(yu)大佬的路上更进一步。

这次放出来的是手写一个instanceOf,如果抄的不好,烦请见谅。

两种实现方式

const myInstanceof = (target, origin) => {
    while (target) {
      if (target.__proto__ === origin.prototype) {
        return true
      }
      target = target.__proto__
    }
    return false
  }
// 来源:阿冲
function myInstanceof(left, right) {
    //基本数据类型直接返回false
    if(typeof left !== 'object' || left === null) return false;
    //getProtypeOf是Object对象自带的一个方法,能够拿到参数的原型对象
    let proto = Object.getPrototypeOf(left);
    while(true) {
        //查找到尽头,还没找到
        if(proto == null) return false;
        //找到相同的原型对象
        if(proto == right.prototype) return true;
        proto = Object.getPrototypeOf(proto);
    }
}
// 来源:掘金-神三元

总结下

function myInstanceof(target, origin) {
    // 非object直接返回false
    if(typeof target !== 'object' || target === null) return false;
    
    var proto = Object.getPrototypeOf(target);
    while (proto) {
      if (proto === origin.prototype) {
        return true
      }
      proto = Object.getPrototypeOf(proto);
    }
    return false
}

我感觉还是 while (proto) 看起来比较舒服点。 如果有其他意见,emm...我不要你觉得,我要我觉得!


原始值的instanceof

class PrimitiveString {
  static [Symbol.hasInstance](x) {
    return typeof x === 'string'
  }
}
const primitive = trye => {
  return class {
    static [Symbol.hasInstance](value) {
      return typeof value === trye
    }
  }
}
const primitiveString = primitive('string')
const primitiveNumber = primitive('number')
console.log('123' instanceof primitiveString)
console.log(123 instanceof primitiveNumber)

最近想写点东西,却又不知道写啥,每天在群里看别人问题、出题、解题,感觉自己就是个混子,希望可以混成掘(mo)金(yu)大佬。

博客原文地址:xiaoranzife.com/guide/jichu…