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

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

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

    附加继承法的原理:

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

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

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

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

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

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

    附加继承法的缺陷:

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

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

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

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

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

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

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

    The End.


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

目录
相关文章
|
3月前
|
设计模式 JavaScript 前端开发
在JavaScript中,继承是一个重要的概念,它允许我们基于现有的类(或构造函数)创建新的类
【6月更文挑战第15天】JavaScript继承促进代码复用与扩展,创建类层次结构,但过深的继承链导致复杂性增加,紧密耦合增加维护成本,单继承限制灵活性,方法覆盖可能隐藏父类功能,且可能影响性能。设计时需谨慎权衡并考虑使用组合等替代方案。
41 7
|
3月前
|
JavaScript 前端开发
在 JavaScript 中,实现继承的方法有多种
【6月更文挑战第15天】JavaScript 继承常见方法包括:1) 原型链继承,利用原型查找,实例共享原型属性;2) 借用构造函数,避免共享,但方法不在原型上复用;3) 组合继承,结合两者优点,常用但有额外开销;4) ES6 的 class,语法糖,仍基于原型链,提供直观的面向对象编程。
31 7
|
9天前
|
开发者 图形学 iOS开发
掌握Unity的跨平台部署与发布秘籍,让你的游戏作品在多个平台上大放异彩——从基础设置到高级优化,深入解析一站式游戏开发解决方案的每一个细节,带你领略高效发布流程的魅力所在
【8月更文挑战第31天】跨平台游戏开发是当今游戏产业的热点,尤其在移动设备普及的背景下更为重要。作为领先的游戏开发引擎,Unity以其卓越的跨平台支持能力脱颖而出,能够将游戏轻松部署至iOS、Android、PC、Mac、Web及游戏主机等多个平台。本文通过杂文形式探讨Unity在各平台的部署与发布策略,并提供具体实例,涵盖项目设置、性能优化、打包流程及发布前准备等关键环节,助力开发者充分利用Unity的强大功能,实现多平台游戏开发。
25 0
|
17天前
|
JavaScript 前端开发 开发者
揭开JavaScript的神秘面纱:原型链背后隐藏的继承秘密
【8月更文挑战第23天】原型链是JavaScript面向对象编程的核心特性,它使对象能继承另一个对象的属性和方法。每个对象内部都有一个[[Prototype]]属性指向其原型对象,形成链式结构。访问对象属性时,若当前对象不存在该属性,则沿原型链向上查找。
23 0
|
25天前
|
JavaScript 前端开发
JS的6种继承方式
JS的6种继承方式
|
3月前
|
设计模式 JavaScript 前端开发
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
JavaScript的继承机制基于原型链,它定义了对象属性和方法的查找规则。每个对象都有一个原型,通过原型链,对象能访问到构造函数原型上的方法。例如`Animal.prototype`上的`speak`方法可被`Animal`实例访问。原型链的尽头是`Object.prototype`,其`[[Prototype]]`为`null`。继承方式包括原型链继承(通过`Object.create`)、构造函数继承(使用`call`或`apply`)和组合继承(结合两者)。ES6的`class`语法是语法糖,但底层仍基于原型。继承选择应根据需求,理解原型链原理对JavaScript面向对象编程至关重要
64 7
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
|
1月前
|
设计模式 JavaScript 前端开发
js对原型和继承的理解
了解JavaScript中原型和继承的概念对于编写优雅高效的代码、理解库和框架的内部机制以及执行高级设计模式都有着重要的意义。
35 0
|
3月前
|
JavaScript 前端开发 Java
使用JavaScript进行面向对象编程的指南
使用JavaScript进行面向对象编程的指南
28 4
|
3月前
|
JavaScript 前端开发
JavaScript进阶-原型链与继承
【6月更文挑战第18天】JavaScript的原型链和继承是其面向对象编程的核心。每个对象都有一个指向原型的对象链,当查找属性时会沿着此链搜索。原型链可能导致污染、效率下降及构造函数与原型混淆的问题,应谨慎扩展原生原型、保持原型结构简洁并使用`Object.create`或ES6的`class`。继承方式包括原型链、构造函数、组合继承和ES6的Class继承,需避免循环引用、方法覆盖和不当的构造函数使用。通过代码示例展示了这两种继承形式,理解并有效利用这些机制能提升代码质量。
54 5
|
3月前
|
JavaScript 前端开发
JavaScript 继承的方式和优缺点
JavaScript 继承的方式和优缺点