在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.


  本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
1天前
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
10天前
|
JavaScript 前端开发
Javascript如何实现继承?
【10月更文挑战第24天】JavaScript 中实现继承的方式有很多种,每种方式都有其优缺点和适用场景。在实际开发中,我们需要根据具体的需求和情况选择合适的继承方式,以实现代码的复用和扩展。
|
4天前
|
JavaScript 前端开发
如何使用原型链继承实现 JavaScript 继承?
【10月更文挑战第22天】使用原型链继承可以实现JavaScript中的继承关系,但需要注意其共享性、查找效率以及参数传递等问题,根据具体的应用场景合理地选择和使用继承方式,以满足代码的复用性和可维护性要求。
|
4天前
|
JavaScript 前端开发 开发者
js实现继承怎么实现
【10月更文挑战第26天】每种方式都有其优缺点和适用场景,开发者可以根据具体的需求和项目情况选择合适的继承方式来实现代码的复用和扩展。
17 1
|
2月前
|
自然语言处理 JavaScript 前端开发
一文梳理JavaScript中常见的七大继承方案
该文章系统地概述了JavaScript中七种常见的继承模式,包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合继承等,并探讨了每种模式的实现方式及其优缺点。
一文梳理JavaScript中常见的七大继承方案
|
30天前
|
JavaScript 前端开发 Java
JavaScript中的面向对象编程(OOP) - 终极指南
本文介绍了 JavaScript 的面向对象编程 (OOP) 概念,包括继承、多态、封装和抽象等关键要素,并通过代码示例帮助开发者理解和应用 OOP 思维。
35 5
|
2月前
|
JavaScript 前端开发
js之class继承|27
js之class继承|27
|
2月前
|
JavaScript 前端开发 Java
js面向对象编程|24
js面向对象编程|24
|
2月前
|
JSON JavaScript 前端开发
js原型继承|26
js原型继承|26
|
2月前
|
JavaScript 前端开发 开发者
JavaScript 类继承
JavaScript 类继承
19 1