根据原型链实现instanceof

Posted 彭博

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据原型链实现instanceof相关的知识,希望对你有一定的参考价值。

原型链

  • js 中的引用数据类型可以分为以下两种

    1. 引用类型实例
    2. 构造函数(类)
  • 一个引用类型站在不同的角度,会有不同的身份,

    // 1. Obj 是一个方法 ,可以单独调用执行(当作为函数调用时也是 Function 的实例)
    // 2. Obj 是一个构造函数,可以实例化一个对象
    let Obj = function(){}
  • 作为构造函数身份时,该构造函数会有一个prototype属性,该属性可以称之为显式原型;当作为实例时,该数据存在一个__proto__ 属性,该属性可以称之为隐式原型,__proto__可以通过Object.getPrototypeOf() 方法获得。由于有的数据,如上代码所示,既可以作为实例,又可以作为构造函数,所以,该数据可以同时存在显式原型与隐式原型。更确切的说,函数可以同时有这两个属性。(简而言之, prototype 是用于类的,而 Object.getPrototypeOf() 是用于实例的(instances),两者功能一致。[1]
  • 原型链是指数据的隐式原型组成的引用关系。注意不是显式原型

    let Obj = function(){}
    // 当A 的隐式原型 === B的显式原型,A 就是B的(子类)实例
    Obj.__proto__ === Function.prototype
    Obj.__proto__.__proto__ === Object.prototype
    // Obj.__proto__.__proto__ 可以叫做原型链
    // 原型链的顶端是 null 即 Object.prototype.__proto__ === null
  • A instanceof B 通过要查找原型链来确定A是否是B的实例。

实现

  • 通过查找child 的隐式原型链,来确认是否存在引用是parent的显式原型。

    function instanceOf(child, parent){
    // 这里应该有基本数据类型的过滤
    // 偷个懒
    if(child === null || parent === null) return false
    const left = child.__proto__
    const right = parent.prototype
    if(left === right) return true
    return instanceOf(left,parent)
    }
    const r1 = instanceOf(1, Number)
    console.log(r1)
    [1] https://developer.mozilla.org...

以上是关于根据原型链实现instanceof的主要内容,如果未能解决你的问题,请参考以下文章

几行代码实现instanceof

instanceof运算符的实质:Java继承链与JavaScript原型链

instanceof运算符的实质:Java继承链与JavaScript原型链

js实现instanceof

关于JS原型以及原型链instanceof的一些理解

手写 instanceof 方法