Javascript面向对象编程(二):构造函数的继承

Javascript对象之间"继承"的5种方法:

  function Transportation(){

    this.category="交通工具";

  }

  function Car(name){

    this.name=name;

  }

1.  构造函数绑定模式: 使用call或者apply方法,将父对象的构造函数绑定在子对象上。

  function Car(name){

    Transportation.apply(this,arguments);

    this.name=name;

  }

  var car_A=new Car("BMW");

  alert(car_A.category);  //交通工具

2. prototype模式:子对象的prototype对象,指向一个父类的实例对象,那么子对象的实例,就能继承父对象了。

(1). 将Car的prototype对象指向一个Transportation的实例:

  Car.prototype=new Transportation();

此行增加了Car的prototype定义,会导致car_A.constructor也会指向Transportation;

(2). 将Car的prototype.constructor指向Car(若无此行,Car的prototype.constructor指向的是Transportation):

  Car.prototype.constructor=Car;

  var car_A=new Car("BMW");

  alert(car_A.category);  //交通工具

3. 方法2的改进:直接继承prototype

父对象中,不变的属性都可以直接写入Transportation.prototype。然后我们将子对象的prototype直接继承父对象的prototype。

  function Transportation(){}

  Transportation.prototype.category="交通工具";

  Car.prototype=Trasportation.prototype;

  Car.prototype.constructor=Car;

  var car_A=new Car("Audi");

  alert(car_A.category);  //交通工具

此种方法的优点:效率高,因为不用执行和建立Transportation的实例,节省内存;

此种方法的缺点:父对象和子对象的prototype都指向了同一个对象,那么对任意一个子对象prototype的修改,都会反应到父对象的prorotype。

如:

  第二行中: Car.prototype.constructor=Car;

其实就是把Transportation.prototype对象的constructor也改掉了;

  alert(Transportation.prototype.constructor);  //Car

4. 利用空对象作为中介:

  var F=function(){};

  F.prototype=Transportation.prototype;

  Car.prototype=new F();

  Car.prototype.constructor=Car;

F是空对象,几乎不占内存。修改了子对象Car的prototype对象,就不会影响到父对象Transportation的prototype对象。

可以将上面的写法封装成一个函数:

  function extend(Child,Parent){

    var F=function(){};

    F.prototype=Parent.Prototype;

    Child.prototype=new F();

    Child.prototype.constructor=Child;

    //为子对象设一个uber属性,该属性直接指向父对象的prototype属性。

    // 只是为了实现继承的完备性,纯属备用性质的一行代码。

    Child.uber=parent.prototype;

  }

  extent(Car,Transportation);

  var car_A=new Car("BMW");

  alert(car_A.category);  //交通工具

5. 拷贝继承:把父对象的所有属性和方法,拷贝进子对象。

  function Transportation(){}

  Transportation.prototype.category="交通工具";

  function copyAll(Child,Parent){

    var p=Parent.prototype;

    var c=Child.prorotype;

    for(var i in p){

      c[i]=p[i];

    }

    c.uber=p;

  }

使用时:

  copyAll(Car,Transportation);

  var car_A=new Car("BMW");

  alert(car_A.category);  //交通工具

posted @ 2015-12-14 15:01  我喂自己袋盐_1989  阅读(208)  评论(0)    收藏  举报