利用链表数据结构实现instanceof

226 阅读1分钟

1.链表数据结构

链表的数据结构是一个个对象,里面存放着值和指向下个对象的next属性。代码表示如下

//辅助类创建node
function Node (val) {
  this.val = val || 0
  this.next = null
}
//链表类
function NodeLink () {
  this.head = null
}
//插入链表
NodeLink.prototype.append = function (val) {
  let node = new Node(val)
  if (this.head) {
    let p = this.head
    while (p.next) {
      p = p.next
    }
    p.next = node
  } else {
    this.head = node
  }
}

通过观察链表的数据结构,其实我们学习的原型链不就是一个链表吗,我们的原型链的连接是依靠实例上的__proto__属性来连接。

 let arr = []
 let obj = {}
 obj.__proto__ === Object.prototype
 arr.__proto__ === Array.prototype
 Array.prototype.__proto__ === Object.prototype
 Object.prototype.__proto__ === null

2.instanceof作用

instanceof 运算符主要作用是检测构造函数的prototype是否出现在某个实例的原型上,代码翻译就是

 let fun = ()=>{}
 fun instanceof Function //true
 fun instanceof Object //ture
 fun instanceof Number //false

通过实践发现,A instanceof B 时候,A会一层层的往原型上找,看原型上有没有B的prototype相等,一样的时候就返回true,否则返回false,这个过程就是遍历链表的过程了,代码如下

 function myInstace(A,B){
    //声明一个指针
    let p = A
    while(p){
        if(p === B.prototype){
            return true
        }
        //指向下一个遍历
        p = p.__proto__
    }
    return false
 }