大家可以通过以下链接去了解prototype是如何被javascipt之父创造出来的,博文由前端大牛阮一峰编写。
http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html?20150514161436
但是文中有一个我不是很赞同的地方,第三小节作者是这样说的:
用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法。
比如,在DOG对象的构造函数中,设置一个实例对象的共有属性species。
function DOG(name){
this.name = name;
this.species = '犬科';
}
然后,生成两个实例对象:
var dogA = new DOG('大毛');
var dogB = new DOG('二毛');
这两个对象的species属性是独立的,修改其中一个,不会影响到另一个。
dogA.species = '猫科';
alert(dogB.species); // 显示"犬科",不受dogA的影响
每一个实例对象,都有自己的属性和方法的副本。这不仅无法做到数据共享,也是极大的资源浪费。
每一个实例都有自己特有的属性,改变dogA必然不能引起其他实例属性的改变所以作者使用dogB不受dogA的影响来作为无法共享的例子是不太合适的,此处应注意一下。我猜想作者的初衷是指无法通过改变实例的构造函数来整体改变实例的属性,即无法通过类似DOG.species 的方法来改变子类的属性。因此引入了prototype属性。