什么是原型链
ECMAScript中,每个由构造器创建的对象都拥有一个指向构造器prototype属性值的隐式引用,这个引用称为原型(prototype)。
每个原型也可以拥有指向自己原型的隐式引用(即该原型的原型),如此下去,就是所谓的原型链(prototype chain),在具体的语言实现中,每个对象都有一个__proto__属性来实现对原型的隐式引用。
理解了原型链,便可以实现继承。ECMAScript规定,当要给某个对象的属性赋值时,解释器会查找该对象原型链中第一个含有该属性的对象(原型本身就是一个对象,那么原型链即为一组对象的链。对象的原型链中的第一个对象是该对象本身)。如果要获取某个对象属性的值,解释器会返回该对象原型链中首先具有该属性的对象属性值。如图:
原型链中的属性隐藏机制
图中,object1、prototype1、prototype2构成了对象object1的原型链。因为在object1中已经找到了prototype4属性,所以prototype1的prototype4属性被隐藏。同理,在prototype1中找到了prototype3属性,所以prototype2中的prototype3属性也被隐藏。
利用原型链实现继承
//声明Animal对象构造器 function Animal () {}; //将Animal的prototype属性指向一个对象; //亦可以理解为指定Animal对象的原型 Animal.prototype={ name:"mengmeng", weight:200, eat:function(){ alert("动物"); } } //声明Mammal对象构造器 function Mammal () { this.name = "哺乳动物"; } //指定Mammal对象的原型为一个Animal对象。 //实际上此处便是在创建Mammal对象和Animal对象之间的原型链 Mammal.prototype = new Animal(); //声明Horse对象构造器 function Horse (height,weight) { this.name = "horse"; this.height = height; this.weight = weight; } //将Horse对象的原型指定为一个Mammal对象,继续构建Horse与Mammal之间的原型链 Horse.prototype = new Mammal(); //重新指定eat方法,此方法将覆盖从Animal原型继承来的eat方法 Horse.prototype.eat=function () { alert("马"); } var horse = new Horse(100,300); horse.eat();//马 alert(horse.__proto__ == Horse.prototype);//true alert(horse.prototype.__proto__ == Mammal.prototype);//true alert(Mammal.prototype.__proto__ == Animal.prototype);//true
参考文章:http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/