起因
从初学到现在,我发现关于原型链的解释都停留在原型链本身,从一个事物的多方面去了解一个事物,是非常有益的,所以今天突然就有灵感(其实是压制不住自己的思维),借助链表和javascript类背后的原型委托思想来解释原型。
原型链的本质----> 特殊链表
普通链表
原型链表(以""为例)
就像我们一般设置的链表中的next指针,javascript为了我们提供了内置的next指针__proto__,对于原型链表,由于不想普通单向链表项一样都是同一个类派生的对象,在这里我称原型链为特殊链表
类模拟背后的思想-委托
这里提一下,JavaScript本身并没有提供“继承”,继承的本意是复制,而javascript本身实现所谓的继承,是将属性进行代理得到的,而代理的意思,就是我在你身上没有找到属性,那么就去与你关联的上级**__proto__链接的下一个节点**去找这个属性
prototype只是一个“特殊的节点类型”
原型链的本质是为了实现属性的[[GET]]操作,prototype我认为是为了在使用构造函数创建对象时,自动设置链表中的next属性,即将对象的__proto__链接到构造函数的prototype属性的语法糖
一个不使用prototype实现属性委托的例子
let a = {
a: 1
}
let b = {
b: 2
}
let c = {
cj: "cc"
}
Object.setPrototypeOf(a,b) // 等同于a.__proto__ = b
Object.setPrototypeOf(b, c) // 等同于 b.__proto__ = c
console.log(a.cj)
console.log(a.b)
console.log(a.a)
这里无需借助构造函数的prototype属性,一样可以实现属性的委托。
使用prototype作为特殊节点的好处
- 使用构造函数时,能够自动将生成对象的__proto__指向构造器的prototype
- 不需要额外再创建节点,可以在利用现有的prototype属性指向的对象
一句话描述原型链
一条能够让在内部实现属性代理的委托链表
总结
原型链是一条是对象自身作为头节点,内置的__proto__作为next指针,构造器的prototype作为后续节点的特殊单链表
“鼓励”
现在不像以前大佬们开荒,全靠自学,很多大佬们都出了自己的博客,写的很好,我希望能够沉进去技术里面,所以不时会埋头写点文章,希望能够得到大家的小星星,以资鼓励,当然新人写的东西,无论是排版还是严谨方面都有待提高,更多希望大家提出自己的意见,帮助我这个萌新学习。