js 手写instanceOf判断对象是否为构造函数的实例对象

/**
 * 手写instanceOf判断对象是否为构造函数的实例对象
 * @param {Object} obj 实例对象
 * @param {Function} constructor 构造函数
 * @returns Boolean
 */
  function myInstanceOf(obj, constructor) {
    //typeof判断obj数据类型必须为object和function。因为null的typeof为function 所以首先判断为null的特殊情况
    if (obj === null || typeof obj !== "object" || typeof constructor !== "function") {
        return false;
      }
    let pointer = obj.__proto__;//获取obj对象的原型
    //原型链顶层__proto__为null
    while (pointer !== null) {
            //循环查找__proto__如果等于prototype
        if (pointer === constructor.prototype) {
             return true;
        } else {
            //如果obj.__proto__不等于constructor.prototype 继续查找 原型的原型obj.__proto__.__proto__ 直到查找到最顶层原型null为止
         pointer = pointer.__proto__;
       }
    }
    //如果查询不到 说明obj对象不是constructor构造函数的实例
    return false;
 }

typeof、instanceof的区别和使用

typeof 于区分对象和其它原始类型(七种原始数据类型sting number bigint null undefined symbol boolean)

三种例外情况:

1.typeof null 值为 object

2.对象(非函数)、数组 的typeof为 object ,

3.函数的typeof 为 function

 

instanceof 用于检测 右值的prototype 是否出现在左值的原型链(__proto__)上,也就是检测左值对象是否为右值构造函数的实例。

总结 typeof 检测左值属于哪种原始数据类型(三种情况例外)。instanceof 检测左值对象类型归属,左值不是对象则返回flase

posted @ 2023-10-27 10:23  暴燥的小蓝鲸  阅读(58)  评论(0)    收藏  举报