接上一篇的关于继承的文章:Pro javascript学习笔记之jascript继承之一
2 扩展函数方式( The Extend Function)
为了使类的定义更加简单。可以打包所有的子类创建过程在一个函数中。
Extend Function:

extend function
1 function extend(subClass,superClass){
2 var F= function(){};
3 F.prototype= superClass.prototype;
4 subClass.prototype=new F();
5 subClass.prototype.constructor= subClass;
6
7 }
函数extend实现的功能和在上一篇中的首先设置子类的函数的prototype属性为超类的实例。然后指定子类的constructor属性为子类是一样的。但是注意到这里他引入了一个空类F.他的作用是防止超类在这一过程中被实例化。这样同样有益于当超类的构造器要实现一些非常复杂是算法。因为为prototype实例化的对象通常是一个throwaway 的实例。我们不必要实例化他。Car 和Plane如下:

code
1 //class of Car
2 function Car(sColor){
3 this.color=sColor;
4 }
5 Car.prototype.getColor=function(){
6 return this.sColor;
7 }
8 //class of Plane
9 function Plane(sColor,iTyre){
10 Car.call(this,sColor);//call the superclass's constructor in the scope of this
11 this.tyre= iTyre;//add attribution to Plane
12 }
13 extend(Plane,Car);
14 Plane.prototype.getTyre=function(){//add the Plane's methd
15 return this.tyre;
16 }
在这里没有像以前那样用两行代码设置prototype和constructor。只是在定义类后(还没有向类中添加方法)调用extend这个函数。这种方法唯一的问题是超类的名称(Car)在子类(Plane)是硬编码的。我们最好以一种普通的方式引用他。改造extend 函数。
extend function inproved:

extend function improved
1 function extend (subClass,superClass){
2 var F=function(){};
3 F.prototype= superClass.prototype;
4 subClass.prototype= new F();
5 subClass.prototype.constructor= subClass;
6 subClass.superClass= superClass.prototype;
7 if(superClass.prototype.constructor == object.prototype.constructor){
8 superClass.prototype.constructor = superClass;
9 }
10 }
11
这个版本的extend函数代码稍长但是提供了超类的属性。这样就可以降低Plane类和Car类的耦合度。这个版本中前面四行代码和以前的版本相同。后面的三行代码确保constructor属性在指向超类(即使超类是一个自己的对象类)。当你使用这个新的超类的属性调用超类的构造器上面的设置就非常重要。
添加超类的属性使我们能直接调用超类的方法。这个在你想重载一个方法却仍然使用超类的执行方法。比如重载超类Car的方法getColor我们改写他为一个新的版本。

override getColor
1 Plane.prototype.getColor=function(){
2 var color=Plane.superClass.getColor.call(this);
3 alert('the Plane Color is: '+ color+'the trye is :'+ this.getTyre());
4 }