• JS之instanceof方法手写


    方法介绍

    instanceof 是什么?

    用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

    语法:object instanceof constructor
    object:某个实例对象
    constructor:某个构造函数

    简言之就是用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

    个人理解:

    instanceof 是用来判断左侧对象是否是右侧构造函数的实例化对象,或则说左侧对象能否通过其隐式原型 **[[proto]]**在原型链上一层层向上查找到右侧函数的原型对象,即函数原型对象出现在实例对象的原型链上就返回 true。

    通俗的理解: 右侧是不是左侧的爸爸、爷爷、祖宗,只要左侧对象继承自右侧函数就为 true

    instanceof 使用方式:

    object instanceof 构造函数, 它有两个必传参数,左侧必须为对象类型,右侧必须为函数类型。返回值为 Boolean 类型

    注意:你可能会认为js中万物皆对象,这个错误的理解可能会误导大家出现这种写法: 'str' instanceof String,返回值为false,因为 ‘str’ 就是简单的字符串,它和通过String构造函数(new String('str'))创造出来的字符串是有区别的,可自行在控制台打印出来看,其值会封装成String对象类型的字符串,同理 new Number(3) instanceof Number, new Boolean(true) instanceof Boolean ……等等返回值为true。

    代码示例:

    1. // 定义构造函数
    2. function C () {}
    3. function D () {}
    4. // 实例化一个 o 对象
    5. var o = new C()
    6. // true,true --> C.prototype 在 o 的原型链上
    7. console.log(o instanceof C, o.__proto__ === C.prototype, '此时 o 的 __proto__:',
    8. o.__proto__, '此时 C 的 prototype:', C.prototype)
    9. // false,false --> D.prototype 不在 o 的原型链上
    10. console.log(o instanceof D, o.__proto__ === D.prototype)
    11. // true true --> Object.prototype 在 o 的原型链上
    12. console.log(o instanceof Object, o.__proto__.__proto__ === Object.prototype)
    13. // 这时我们修改构造函数 C 的原型为一个空对象
    14. C.prototype = {}
    15. // 实例化一个 o2 对象
    16. var o2 = new C()
    17. // true --> C.prototype 在 o2 的原型链上
    18. console.log(o2 instanceof C)
    19. // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上.
    20. console.log(o instanceof C, '此时 o 的 __proto__:', o.__proto__, '此时 C 的 prototype:', C.prototype)
    21. console.log('此时 D 的 prototype:', D.prototype);
    22. // 继承
    23. D.prototype = new C()
    24. console.log('此时 D 的 prototype:', D.prototype);
    25. var o3 = new D()
    26. // true, true --> 因为 o3 是 构造函数 D new 出来的实例对象,所以 D.prototype 一定在 o3 的原型链上
    27. console.log(o3 instanceof D, o3.__proto__ === D.prototype)
    28. // true --> 因为 C.prototype 现在在 o3 的原型链上
    29. console.log(o3 instanceof C)
    30. // true,true --> 上面的结果为什么为 true 呢,看如下代码,D.prototype 是 构造函数 C new 出来的实例对象,所以 C.prototype 一定在 D.prototype 的原型链上
    31. console.log(o3.__proto__ === D.prototype, D.prototype.__proto__ === C.prototype);
    32. // true 相当于如下代码
    33. console.log(o3.__proto__.__proto__ === C.prototype);

    开始手写

    由上我们可以知道,instanceof其判断的原理是:通过左侧对象的隐式原型属性 __ proto __ 在原型链上向上一层层查找,找到右侧构造函数的原型对象属性 prototype 就返回 true。明白这一点也就很容易写出自己的 instanceof。

    注:需要借助循环来实现。

    1. function myInstanceof(obj, func) {
    2. if(!['function', 'object'].includes(typeof obj) || obj === null) {
    3. // 基本数据类型直接返回false,因为不满足instanceof的左侧参数是对象或者说引用类型
    4. return false
    5. }
    6. let objProto = obj.__proto__, funcProto = func.prototype
    7. while(objProto !== funcProto) {
    8. // obj.__proto__不等于func.prototype时,继续通过__proto__向上层查找
    9. // 当找到原型链尽头Object.prototype.__proto__=null 时还未找到,就返回false
    10. objProto = objProto.__proto__
    11. if(objProto === null){
    12. return false
    13. }
    14. }
    15. // obj.__proto__ 等于 prototype = func.prototype 时,不会进入上面循环,返回true
    16. // 不等进入上面循环,找到相等时会跳出循环,走到这里返回true
    17. return true
    18. }
    19. //测试
    20. function A(){}
    21. let a=new A;
    22. console.log(myInstanceof(a,A))//true
    23. console.log(myInstanceof([],A))//false
  • 相关阅读:
    如何把npm切换成yarn管理项目
    一不小心就掉坑系列,PMP考试在即这些备考技巧确定不来看看?
    Java算法 每日一题(六) 编号203:移除链表元素
    Qt 项目实战 | 音乐播放器
    D1. 388535 (Easy Version)(异或+二进制位)
    【Java|golang】1668. 最大重复子字符串
    VTK——模拟深度相机拍摄深度图
    【iMessage苹果推群发】软件安装利用dropbox分享外链进行访问原始文件
    9/19 深搜+网络流
    JQuery
  • 原文地址:https://blog.csdn.net/m0_65335111/article/details/127602834