JS中的原型与原型链

在JavaScript中,如果我们声明一个变量var a = 1var b = new Number(1)是不一样的,前者会将变量a直接存放在stack(栈)内存中,而后者是在stack中建立一个引用,引用的是heap(堆)内存中的对象,该对象拥有两个key:


 其中key:PrimitiveValue的值就是number的值1,今天就重点总结一下对象的另一个key:__proto__

1.原型

如果我们用new的方式创建对象,一般有下面四种数据类型:

 

 

比如:toString()、toFixed()。
对象n怎么拥有这些方法的呢?
重点就是__proto__ 这个属性,每当我们使用new语法的时候,对象就会拥有__proto__ 这个属性,该属性会指向new之后对应函数(也就是Number)的prototype属性,这个属性是Number共有属性,该共有属性会拥有诸多共有方法,也就是说:

2.原型的原型

仍然以对象n为例,如果对象n的方法在共有的Number属性中找不到,怎么办呢?那么会继续向上一层去寻找,就像数据结构一样。也就是说会向Number.prototype.__proto__中继续寻找,该对象对应的就是另一个对象:Object.prototype。

 


如果还找不到再继续向上一层找呢?那么就是Object.prototype.__proto__,它的值为null,也就是在JS的数据结构中,这是顶层了。

 

3.原型链&总结

用一个简答的内存图作为总结:

 

只要是使用new方法得到的对象,不管是string还是Number或者Boolean,这三种数据类型都有其函数对应的prototype方法,而他们三种数据的prototype方法的上一层(prototype.__proto__)就是object对象的prototype方法。如上图所示。
简单总结为一句代码就是:

 

而.__proto一层一层的指向就可以被称为原型链
由此也可以引出以下几个推论:

 

 

 

posted @ 2020-08-13 09:42  刘家小生  阅读(251)  评论(0)    收藏  举报