js中如何实现一个instanceof功能

instanceof实际上是基于原型链查找,它用于检测构造函数的prototype属性是否出现在某个实例对象的原型链。

MDN相关介绍:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof

比如检测一个元素是否为数组

[] instanceof Array;

打印结果为true。这是因为[].__proto__指向的是Array.prototype,正好符合概念中所描述的那样(实例对象可以通过原型链指向构造函数的原型)。

然而像字符串这种比较特殊,'hello' instanceof String打印的结果为false,需要使用new String('hello') instanceof String形式才会打印出true

基于这种原理,通过不断循环向上查找原型,可以实现一个类似instanceof功能的函数。

function instanceOf(source, target) {
  if (typeof source !== "object" || source === null) return false;
  let proto = Object.getPrototypeOf(source);
  while (true) {
    if (proto === null) return false;
    if (proto === target.prototype) return true;
    proto = Object.getPrototypeOf(proto);
  }
}

对于基本类型,还是推荐使用typeof来进行类型判断,instanceof并不是最佳的方案。

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注