在JavaScript面向对象编程中使用继承(5)

这"茴"字的第四种写法, 附加继承法,虽然是我自己杜撰出来的,而且还有一些前面三种继承法的影子,不过这个方法不可否认的,可以把前面说到继承的问题都cut掉 。下面我们就来仔细说说到底它是为什么这么有武功和智慧的呢?

    附加继承法的原理:

    附加继承法的关键代码是其构找函数ArrayList04()中的:
  this .base  =   new  CollectionBase();
  
  
for  (  var  key  in   this .base )
  {
      
if  (  ! this [key] )
      {
          
this [key]  =   this .base[key];
      } 
  }

    这里其实给不给 this附加一个base并不重要,也一点不会影响我们的这个继承方法。首先我们看到在构造函数的第一句话中,我们立马就 new了一个基类实例出来,这就说明我们的继承对基类的书写是没有任何要求的,用前面 实例继承法中的说法就是,只要脚本引擎认为正确的类就都可以。我们知道 构造继承法为什么有问题呢?就是因为它始终没有创建基类的实例。而 原型继承法虽然也创建了基类实例,不过它把积累实例直接赋给了子类的prototype属性,以至于搞的对子类书写有特殊的要求。

    然后接下来一个 for( in )循环,把基类具有的所有属性和方法都附加到子类的实例 this中了,这也是我把这个继承方法叫附加法的原因。这一步和 构造继承法的原理相当的类似,只是构造继承法是用了 this作用域置换的一个技巧,把这个附加的过程让基类构造函数来完成了,不过同时也给构造继承法带来基类书写的特别要求,不能使用其prototype特性。当然附加法仍然是没有这个要求的。

    附加继承法的Update:
  Object.prototype.Extends  =   function (BaseClass)
 {
     
if  ( arguments.length  >=   6  )
     {
         
throw   new  Error('Only can supprot at most 5  parameters.');
     }
    
var  base;
    
if  ( arguments.length  >   1  )
     {
         
var  arg01  =  arguments[ 1 ];
         
var  arg02  =  arguments[ 2 ];
         
var  arg03  =  arguments[ 3 ];
        
var  arg04  =  arguments[ 4 ];
         base 
=   new  BaseClass(arg01, arg02, arg03, arg04);
     }
    
else
     {
         base 
=   new  BaseClass();
     }
     
for  (  var  key  in  base )
     {
         
if  (  ! this [key] )
         {
             
this [key]  =  base[key];
             
if  (  typeof (base[key])  !=  ' function ' )
             {
                 
delete  base[key];
             }
         }
     }
     
this .base  =  base;
     
//  base.Inherit = this;
 
};
    
    这样我们就的继承就可以直接写成:
  function  ArrayList04()
 {
     
this .Extends(CollectionBase);
     
//  ...
 
}

    同时还提供了对基类继承时,传递参数给基类的支持,比如:
  function  ListItem()
 {
     
this .Extends(ListItemBase, text, value);
     
//  ...
 
}

    对于基类,会执行 new ListItemBase(text, value);这样的操作来生成基类的实例。

    附加继承法的缺陷:

    从目前我的使用来看,如果不使用override技术来重写方法,然后还在新的方法中去调用基类的方法(这个技术我会以后再讲,因为它不影响也不属于我们今天讨论的继承方式的这个话题)的话。附加法基本没有缺陷,一定要说有就的话就是:使用一个 for( in )循环来进行基类的导入,语法上很ugly:(

    附加继承法的示例:
  document.write('附加继承法: < br > '); 
 
var  arrayList41  =   new  ArrayList04();
 arrayList41.Add('a');
 arrayList41.Add('b');
 arrayList41.foo();
 
var  arrayList42  =   new  ArrayList04();
 arrayList42.Add('a');
 arrayList42.Add('b');
 arrayList42.Add('c');
 arrayList42.foo();

    示例运行结果为:
  附加继承法:
 [class ArrayList04]: 
2 : a,b
 [class ArrayList04]: 
3 : a,b,c

    小结:附加继承法是看起来最不像继承,但却是实际使用中最sexy(PS:这是我们boss对好代码的称呼)的解决方案。其override也非常的清晰明了,只要在 this.Extends(BaseClass);语句后有同名的方法被导入子类,就会自动覆盖从基类中导入的方法,实现override的效果。

    使用场景:anywhere, anytime, anybody...

    这话似乎说大了 ,完美的东西一定是没有的,附加继承法也是有缺陷的,只不过这个缺陷不属于继承这个范畴,而是对其它OO编程特性的模拟中出现的问题,以后再谈。再唐僧一下:光是类的继承和使用, 附加继承法是没有任何问题的。

    总算完成了JScript模拟面向对象编程中实现继承的各种研究。

    The End.
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值