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
}