原型链继承:
父类:也称超类型
子类:称子类型
先写三个函数:
1 function Box(){ //被继承的函数叫超类型 2 this.name='Lee'; 3 } 4 function Desk(){ //继承的函数叫子类型 5 this.age=100; 6 } 7 function Table(){ 8 this.level='jack'; 9 }
下面是继承:
1 Desk.prototype=new Box(); //继承之后才实例化对象 2 var desk=new Desk(); 3 alert(desk.name); //Lee 4 Table.prototype=new Desk(); 5 var table=new Table(); 6 alert(table.name+' '+table.age); //Lee100
其实最主要的一句话是:Desk.prototype=new Box()和Table.prototype=new Desk();这两句是实现原型链的关键。
解答:超类型实例化之后的对象实例复制给子类型的原型属性;new Box()会将Box构造里的信息和原型都交给Desk;Desk的原型得到的是Box的构造+原型的信息
如果被继承函数有原型属性又有实例属性,访问的时候一样是就近原则:实例有的就返回,没有就找原型。
下面是示例函数:
1 function Box(){ //被继承的函数叫超类型 2 this.name='Lee'; 3 } 4 Box.prototype.name='Jack'; //增加原型属性 5 function Desk(){ //继承的函数叫子类型 6 this.age=100; 7 }
Desk继承Box:
1 Desk.prototype=new Box(); //原型链继承 2 var desk=new Desk(); 3 var box=new Box(); 4 alert(desk.name); //就近原则,实例有就返回,没有就找原型 Lee
子类型与父类型相同的属性会被子类型覆盖,而子类型没有的属性会继承
1 function Box(name,age){ //被继承的函数叫超类型 2 this.name=name; 3 this.age=age; 4 } 5 Box.prototype.run=function(){ 6 return this.name+this.age+'运行中·······'; 7 } 8 function Desk(){ //继承的函数叫子类型 9 this.name='jack'; 10 } 11 Desk.prototype=new Box('Lee',100); //原型链继承 12 var desk=new Desk(); 13 alert(desk.run()); //jack100运行中········ 14 alert(desk.name); //jack
解答:因为Desk里有name属性,所以会覆盖继承来的Box里的name属性,所以Lee被jack覆盖了。
继承图: