JavaScript中的类型判断(附)—— 经典面试题之手动实现instanceof方法

90 阅读2分钟

前言

JavaScript 中的 instanceof 运算符用于检查一个对象是否是某个构造函数的实例。关于instanceof方法可以前往往期文章JavaScript中的类型判断(二)—— instanceof与Object.prototype.toString.call()进行阅读。在本文中,我们将手动实现一个类似于 instanceof 的功能,即 myInstance 函数。这个函数接受两个参数 LR,分别表示被比较对象和目标构造函数。

实现思路

我们可以通过以下几个步骤来实现 myInstance 函数:

  1. 首先,将被比较对象 L 的隐式原型(即 __proto__)赋值给变量 left
  2. 将目标构造函数 R 的原型赋值给变量 right
  3. 进入一个循环,循环条件为 left 不为 null。在每次循环中,首先判断 left 是否与 right 相等,如果相等,则表示 LR 的实例,返回 true
  4. 如果当前的 left 不等于 right,则将 left 更新为其自身的隐式原型(即 left = left.__proto__),继续下一次循环。
  5. 当循环结束时,如果仍未找到匹配,则表示 L 不是 R 的实例,返回 false

示例

console.log(myInstance([], Array)); // true
console.log(myInstance({}, Array)); // false
console.log(myInstance([], Object)); // true

第一个例子中,空数组 []Array 构造函数的实例,因此返回 true

第二个例子中,空对象 {} 不是 Array 构造函数的实例,因此返回 false

第三个例子中,空数组 [] 同样也是 Object 构造函数的实例,因为 Array 继承自 Object,所以返回 true

完整代码

下面是完整的 myInstance 函数代码:

function myInstance(L, R) {
  let left = L.__proto__;
  let right = R.prototype;
  //一直往下面找实例对象的隐式原型,直达到null才截至
  while (left !== null) {
    if (left === right) {
      return true;
    }
    left = left.__proto__;
  }

  return false;
}

总结

本文介绍了如何手动实现类似于 instanceof 的功能。通过实现 myInstance 函数,我们更深入地理解了 JavaScript 中原型链和对象关系的工作方式。当面试官问到我们是否了解 instanceof 运算符时,我们可以用这个函数来展示我们对 JavaScript 原型链的理解和运用能力。

该系列往期文章: