封装一个继承函数

95 阅读1分钟

结合阮一峰大神的文档做下个人总结,详细介绍可以看下原网址:# 构造函数的继承

比如,现在有一个"动物"对象的构造函数。


function Animal(){

    this.species = "动物";

  } 还有一个"猫"对象的构造函数。


function Cat(name,color){

    this.name = name;

    this.color = color;

  } 要实现猫继承动物的属性。

利用一个空对象作为中介,继承Animal的prototype,F是一个空对象,所以几乎不占内存。

我们将上面的方法,封装成一个函数,便于使用。

  function extend(Child, Parent) {

var F = function(){};

    F.prototype = Parent.prototype;

    Child.prototype = new F();

   //任何一个prototype对象都有一个constructor属性,指向它的构造函数。
   //因此,在运行"Child.prototype = new F();"这一行之后,Child.constructor也指向Parent!
   //这显然会导致继承链的紊乱,因此我们必须手动纠正,将Child.prototype对象的constructor值改为Child。

    Child.prototype.constructor = Child;

    Child.uber = Parent.prototype;

  }

使用的时候,方法如下

  extend(Cat,Animal);

  var cat1 = new Cat("大毛","黄色");

  alert(cat1.species); // 动物 这个extend函数,就是YUI库如何实现继承的方法。

另外,说明一点,函数体最后一行

  Child.uber = Parent.prototype;

意思是为子对象设一个uber属性,这个属性直接指向父对象的prototype属性。(uber是一个德语词,意思是"向上"、"上一层"。)这等于在子对象上打开一条通道,可以直接调用父对象的方法。这一行放在这里,只是为了实现继承的完备性,纯属备用性质。