实现JavaScript中继承的三种方式

 更新时间:2009年10月16日 21:34:29   作者:  
在JavaScript中,继承可以通过三种手法实现原型链继承 使用apply、call方法 对象实例间的继承。
一、原型链继承
  在原型链继承方面,JavaScript与java、c#等语言类似,仅允许单父类继承。prototype继承的基本方式如下:
复制代码 代码如下:

function Parent(){}
function Child(){}
Child.prototype = new Parent();

  通过对象Child的prototype属性指向父对象Parent的实例,使Child对象实例能通过原型链访问到父对象构造所定义的属性、方法等。
  构造通过原型链链接了父级对象,是否就意味着完成了对象的继承了呢?答案是否定的。如:
复制代码 代码如下:

function Parent(){}
function Child(){}
Child.prototype = new Parent();
var child = new Child();
alert(child.constructor);//function Parent(){}
alert(child instanceof Child);//true

  尽管child依然可以作为Child的实例使用,但此时已经丢失了实例child原有的对象构造信息。弥补该缺陷的方法如下:
复制代码 代码如下:

function Parent(){}
function Child(){}
Child.prototype = new Parent();
Child.prototype.constructor = Child;
var child = new Child();
alert(child.constructor);//function Parent(){}
alert(child instanceof Child);//true

  如上代码片段“Child.prototype.constructor = Child”所示,通过显示地指定对象构造Child的原型,强制所有的Child对象实例的构造都为Child。
二、使用apply、call方法
  由于JavaScript内置的Function对象的apply、call方法改变对象构造中“this”的上下文环境,使特定的对象实例具有对象构造中所定义的属性、方法。
  使用apply、call继承,在实际开发中操作HTML页面上的DOM对象时尤为常用。如:
复制代码 代码如下:

  <div id="extend">apply,call继承</div>
  <script language="javascript">
  function ext()
  {
     this.onclick=function(){alert(this.innerHTML)}
  }
  ext.apply(document.getElementById("extend"));
  ext.call(document.getElementById("extend"));
  </script>

  通过apply或call定义的ext方法,使ext方法内部的this上下文表示为DOM对象“<div id="extend">apply,call继承</div>”。
  值得注意的是,当使用apply、call时,会直接执行对象构造所定义的代码段,如:
复制代码 代码如下:

  <script language="javascript">
  function testExec()
  {
     alert("执行!");
  }
  testExec.call(null);//弹出execute对话框
  testExec.apply(null);//弹出execute对话框
  </script>

三、对象实例间的继承
  JavaScript对象的多态性,允许实例动态地添加属性、方法。该特性造就了JavaScript中的另一种继承手法——对象实例间的继承。如:
复制代码 代码如下:

  var Person = {name:"nathena",age:"26"};
  var nathena = {sex:"male"};
  (function inlineExtends(so,po)
  {
    for (var i in po)
    {
      if (so[i])//如果so也具有这个成员
        continue;
      so[i] = po[i];
    }
  })(nathena,Person);
  alert(nathena.name);//返回nathana

  如以上代码所示,在对象的实例间继承中,父对象Persong定义了“人”所具有的共同属性name、age,子对象nathena定义了自己的私有属性“sex”。函数inlineExtends的功能是,为子对象nathena复制父对象Person中定义的“人”所具有的共同属性。
  其中特别需要注意的语句是“if (so[i])”,此句确保了子对象原有的成员不被父对象中同名的成员所覆盖,而违背面向对象中父子对象之间继承的原则——子对象可以覆盖、重载父对象的属性或方法,父对象仅能对子对象隐藏自己的属性或方法。

相关文章

  • javascript 模式设计之工厂模式学习心得

    javascript 模式设计之工厂模式学习心得

    接口的实现,从而使不同子类可以被同等的对待,恰当的使用工厂模式,但不要拘泥与形式,理解本质。
    2010-04-04
  • 详解new function(){}和function(){}() 区别分析

    详解new function(){}和function(){}() 区别分析

    只要 new 表达式之后的 constructor 返回(return)一个引用对象(数组,对象,函数等),都将覆盖new创建的匿名对象,如果返回(return)一个原始类型(无 return 时其实为 return 原始类型 undefined),那么就返回 new 创建的匿名对象。
    2008-03-03
  • JavaScript 基于原型的对象(创建、调用)

    JavaScript 基于原型的对象(创建、调用)

    在我们写js代码的时候,内部对象是不可避免的要引用,但是光靠这些对象是不够的,所以需要我们自己定义对象,这个时候通常用到的对象是第三种,即基于原型的对象,下面就如何创建自己的对象,定义对象的方法、属性,调用对象给出详细的说明。
    2009-10-10
  • JavaScript 设计模式学习 Singleton

    JavaScript 设计模式学习 Singleton

    JavaScript设计模式学习 Singleton
    2009-07-07
  • 面向对象的Javascript之一(初识Javascript)

    面向对象的Javascript之一(初识Javascript)

    Javascript是一门极富表现力的语言,在当今大行其道的Web浪潮中扮演着非常关键的作用。合理、高效地利用这门技术,可以让我们的Web世界多姿多彩。首先,我们认识一下这门技术的几个独特的特性
    2012-01-01
  • JavaScript对象链式操作代码(jquery)

    JavaScript对象链式操作代码(jquery)

    自从使用了jQuery以后,对它的链式操作很是依赖,以至于常常觉得其他库不好用。。
    2010-07-07
  • JavaScript 继承使用分析

    JavaScript 继承使用分析

    继承,通俗地说,之前你写过一些类,这些类中有一些是而你现在要写的类的功能的子集或者基本相同,那么你不用完全重新写一个新的类,你可以把之前写的类拿过来使用.这样的一种代码重用过程就叫做继承
    2011-05-05
  • javscript对象原型的一些看法

    javscript对象原型的一些看法

    javscript对象原型的小技巧。学习js面向对象的朋友可以参考下。
    2010-09-09
  • javascript 设计模式之单体模式 面向对象学习基础

    javascript 设计模式之单体模式 面向对象学习基础

    单体是在脚本加载时创建的,能将一系列有关联的变量和方法组织为一个逻辑单元,逻辑单元里面的内容通过单一的变量进行访问,也是笔记基础与常用的面向对象的定义方法。
    2010-04-04
  • JavaScript 继承机制的实现(待续)

    JavaScript 继承机制的实现(待续)

    JavaScript继承机制的实现,后期会有一些补充。
    2010-05-05

最新评论