当说到JS继承时,只有一种结构:对象。每个实例对象都有一个私有属性__proto__
,并指向原型对象prototype
。原型对象本身也有自己的原型对象,向上递进到对象的原型对象为null
。null没有原型,并且是原型链的最终环节。
尽管这种原型继承被认为是JS的弱点之一,但原型继承模型本身就比经典模型更强大。
函数是对象,我们用构造函数的方法使Number、Boolean、String来变成对象。
在上图中,我们可以看到:
n是Number的实例,n里面有__porto__
指向Number()
函数,同时是n的原型对象prototype
。
Number()
函数里有__porot__
指向Object
函数,同时是Number()
的原型对象,Number
是Object
的实例。
Object
的原型对象是最终的null
。
那么就可以得出公式:
公用属性都放在同一个地方,就是为了可以共享、节省内存,而这个地方就叫原型。
每一个原型都需要被引用(链接),那这个过程就是原型链。
如果没有原型链的引用,根据浏览器的垃圾回收机制,都会被浏览器抹杀掉,从而导致崩溃。