从使用方法入手到手写instanceof

161 阅读1分钟

本文档已更新于 【前端橘子君】 【Github】

instanceof用于判断一个实例是否属于某种类型。

前置知识

理解instanceof需要对原型和原型链有一定理解,如果有所欠缺者可以参考:

原型及原型链

用法

typeof不同的是,instanceof要求开发者必须传入要比较的类型,比如:

typeof [] // 输出`object` 

[] instanceof Array // 输出`true`

其返回值是一个布尔类型

规则

1、如果是比较基本数据类型,则输出false 2、其他类型,则从其原型链网上寻找,直至找到与比较类型相等的 3、如果到Object.prototype.__proto__仍然没有找到,则返回false

原型链知识请参考:原型及原型链

实现

// 实现
function myInstanceof (L, R) {
  var baseType = ['string', 'number', 'boolean', 'undefined', 'symbol'];
  if (baseType.includes(typeof L)) return false; // 如果是基本数据类型,则直接输出`false`

  L = L.__proto__; // 获取当前原型

  while (true) {
    if (L === null) return false; // 找到`Object.prototype.__proto__`仍未找到
    if (L === R.prototype) return true; // 找到了与之相等的原型
    L = L.__proto__; // 如果没有找到与之相等的原型,则向上寻找
  }
}

// 调用
console.log(myInstanceof('abc', String)); // false

console.log(myInstanceof([], Array)); // true
console.log(myInstanceof([], Object)); // true

console.log(myInstanceof({}, Object)); // true

function Person () {}
let person = new Person();
console.log(myInstanceof(person, Person)); // true

更多相关文档,请见:

线上地址 【前端橘子君】

GitHub仓库【前端橘子君】