原型和原型链

230 阅读2分钟

关键词: 原型(prototype)和原型链(proto

1.原型
现在假设我们在数据中不生成原型和原型链,那么每当生成对象的时候,Heap中对象数据里面的哈希表就是~。也就是说每次创建一个数值、字符串、布尔或者普通对象,就有一大推的哈希表跟在后面,这样既重复,又浪费空间的事是不被看好的,所以把他们公有的属性提炼出来,单独封装好,每次要使用的时候引用就可以了,这就是原型(prototype)。

2.原型有哪些?

Number.prototype:数值原型
String.prototype:字符串原型
Boolean.prototype:布尔原型
Object.prototype:对象原型

3.那么什么是原型链呢?
说清楚这个之前我们必须先清楚__proto__是什么?
在这个__proto__:Number目录下的所有的哈希表都是Number.prototype里面的数据。这里虽然他们写在一起,但是实际上在Heap中他们储存的区域并不是同一个 证明一下

var a = new Number(1)
var b = new Number(1)
a === b
  false
a.__proto__ === b.__proto__
  true

我们声明a和b对象,让他们内容完全相同,但是a === b返回的是false,这说明了他们储存位置不一样。然后调用.__proto__的属性,发现a.proto === b.__proto__是相同的,那就是因为他们调用的数值原型是同一个(调用的原型储存位置相同)!所以.__proto__调用的属性Number.prototype和对象自有的属性是储存在两个区域的。

既然是储存在两个区域的,就必须有一个引用,链接两个不同的区域,完成这个功能的就是.__proto__

可以看出,Object.prototype是所有对象的公有属性,也就是原型,之上就没有了(null)。以其中字符串对象为例,首先原型链开端为某字符串对象的自有属性,然后其中.__proto__链接String.prototype,String.prototype的.__proto__链接Object.prototype,最后指向null,原型链结束。由一个末尾子节点开始一直到null结束,整个过程就是原型链

4.理解
第一句话:prototype是函数的原型对象,即prototype是一个对象,它会被对应的__proto__引用。
第二句话:要知道自己的__proto__引用了哪个prototype,只需要看看是哪个构造函数构造了你,那你的__proto__就是那个构造函数的prototype。
第三句话:所有的构造函数的原型链最后都会引用Object构造函数的原型,即可以理解Object构造函数的原型是所有原型链的最底层,即Object.prototype.__proto===null

链接:www.jianshu.com/p/7119f0ab6…
链接:www.jianshu.com/p/79707440c…