js继承

  function Animal(){

    this.species = "动物";

  }

  function Cat(name,color){

    this.name = name;

    this.color = color;

  }

Cat继承Animal的方法:

1.构造函数绑定

第一种方法也是最简单的方法,使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行:

      function Cat(name,color){

        Animal.apply(this, arguments);

        this.name = name;

        this.color = color;

      }

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

      alert(cat1.species); // 动物

2.子原型指向父实例

第二种方法更常见,使用prototype属性。

如果"猫"的prototype对象,指向一个Animal的实例,那么所有"猫"的实例,就能继承Animal了。

      Cat.prototype = new Animal(); // 完全删除了prototype对象原先的值,然后赋予一个新值。Cat.prototype.constructor指向Animal,我们必须手动纠正,第二行将Cat.prototype对象的constructor值改为Cat。

      Cat.prototype.constructor = Cat; // 任何一个prototype对象都有一个constructor属性,指向它的构造函数。每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性。

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

      alert(cat1.species); // 动物

3.子原型直接指向父原型(不能用)

先将Animal对象改写:

      function Animal(){ }

      Animal.prototype.species = "动物";

然后,将Cat的prototype对象,然后指向Animal的prototype对象,这样就完成了继承。

      Cat.prototype = Animal.prototype;

      Cat.prototype.constructor = Cat; // 把Animal.prototype对象的constructor属性也改掉了!!!

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

      alert(cat1.species); // 动物

Cat.prototype和Animal.prototype现在指向了同一个对象,那么任何对Cat.prototype的修改,都会反映到Animal.prototype。

上面代码第2行,把Animal.prototype对象的constructor属性也改掉了!!!

4.利用空对象作为中介,子原型间接指向父原型

      var F = function(){};

      F.prototype = Animal.prototype;

      Cat.prototype = new F();

      Cat.prototype.constructor = Cat;

5.深拷贝继承

  var Chinese = {
    nation:'中国'
  };

  var Doctor ={
    career:'医生'
  }

如果把父对象的所有属性和方法,拷贝进子对象,也能够实现继承。

      function deepCopy(p, c) {

        var c = c || {};

        for (var i in p) {

          if (typeof p[i] === 'object') {

            c[i] = (p[i].constructor === Array) ? [] : {};

            deepCopy(p[i], c[i]);

          } else {

             c[i] = p[i];

          }
        }

        return c;
      }

使用:

var Doctor = deepCopy(Chinese);
原文地址:https://www.cnblogs.com/cag2050/p/6368041.html