prototype 属性的作用
--JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享。也就是说,如果属性和方法定义在原型上,那么所有实例对象就能共享,不仅节省了内存,还体现了实例对象之间的联系。
--原型对象的作用,就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的原因,而实例对象可以视作从原型对象衍生出来的子对象。
JS的原型
js每声明一个function,都有prototype原型,prototype原型是函数的一个默认属性,在函数的创建过程中由js编译器自动添加。
也就是说:当生产一个function对象的时候,就有一个原型prototype。
原型链
所有对象都有自己的原型对象(prototype)。一方面,任何一个对象,都可以充当其他对象的原型;另一方面,由于原型对象也是对象,所以它也有自己的原型。因此,就会形成一个“原型链”(prototype chain):对象到原型,再到原型的原型……
如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype。Object.prototype的原型是null。null没有任何属性和方法,也没有自己的原型。因此,原型链的尽头就是null。
prototype 和 _proto_ 之间的关系
每一个基本对象都有自己的proto属性,而每一个函数对象都有自己的prototype原型(函数对象也属于基本对象,所以也有proto),每当去定义一个prototype的时候,就相当于把该实例的proto指向一个结构体,那么这个被指向结构体就称为该实例的原型。
当定义一个函数对象的时候,其内部就有这样一个链表关系。声明foo对象,自带了proto的属性,而这个属性指向了prototype,从而实现对象的扩展。