JS中的原型与原型链
在JavaScript中,如果我们声明一个变量
var a = 1与var b = new Number(1)是不一样的,前者会将变量a直接存放在stack(栈)内存中,而后者是在stack中建立一个引用,引用的是heap(堆)内存中的对象,该对象拥有两个key:
其中key:PrimitiveValue的值就是number的值1,今天就重点总结一下对象的另一个key:__proto__。
1.原型
如果我们用new的方式创建对象,一般有下面四种数据类型:

比如:toString()、toFixed()。
对象n怎么拥有这些方法的呢?
重点就是
对象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一层一层的指向就可以被称为原型链。
由此也可以引出以下几个推论:


浙公网安备 33010602011771号