• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
新能源汽车行业用户产品设计
新能源汽车行业、面向C端用户的产品设计
博客园    首页    新随笔       管理     

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

明天就要回老家去过年了,关于这个"在JavaScript面向对象编程中使用继承"的话题居然还没有说完。如果不完成,留下来一拖就拖到明年去了。所以还是抽空把它写完,今年的事情今年做,明年还有更重要的任务呢!~~ 下面继续来看茴香豆的"茴"字第四种写法。

 

    这"茴"字的第四种写法,附加继承法,虽然是我自己杜撰出来的,而且还有一些前面三种继承法的影子,不过这个方法不可否认的,可以把前面说到继承的问题都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.

 

 

声明:此文章部分或者全部内容来源于网络,如果侵犯到您的权利,请电邮我(dushizhuma(a)163.com),我将在第一时间内删除此文章并送出我的歉意!

posted @ 2007-04-12 14:59  阿一(杨正祎)  阅读(302)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3