lgwebdream / FE-Interview

🔥🔥🔥 前端面试,独有前端面试题详解,前端面试刷题必备,1000+前端面试真题,Html、Css、JavaScript、Vue、React、Node、TypeScript、Webpack、算法、网络与安全、浏览器
https://lgwebdream.github.io/FE-Interview/
Other
6.82k stars 896 forks source link

Day225:介绍 instanceof 原理并实现 #1044

Open Genzhen opened 3 years ago

Genzhen commented 3 years ago

每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案 欢迎大家在下方发表自己的优质见解 二维码加载失败可点击 小程序二维码

扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。


instanceof

instanceof 主要用于判断某个实例是否属于某个类型,也可用于判断某个实例是否是其父类型或者祖先类型的实例。

instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false。

function myInstanceof(left, right) {
  if (typeof right !== "function") throw new Error("instance error");
  if (!left || (typeof left !== "object" && typeof left !== "function"))
    return false;
  // 获取到原型对象
  const rightVal = right.prototype;
  const leftVal = left.__proto__;
  // 若找不到就一直循环到父类型或祖类型
  while (leftVal) {
    if (leftVal === rightVal) {
      return true;
    }
    leftVal = leftVal.__proto__; // 获取祖类型的__proto__
  }
  return false;
}
console.log(myInstanceof(() => {}, Function)); // true

经典原型链图

prototype

DuBaoQiang commented 3 years ago

@Component({ components: {Editor} })