第六章:继承

Posted joya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章:继承相关的知识,希望对你有一定的参考价值。

1、构造器工作模式——原型链法:

  Child.prototype = new Parent();   //Child.prototype.constructor改变了,成为Parent

  Child.prototype.constructor = Child;

2、构造器工作模式——仅从原型链继承法(速度越快,不需要新建对象实例,不存在链,缺点:子对象修改会影响到父对象,此方法不好,最好不要使用)

  Child.prototype = Parent.prototype;

  Child.prototype.constructor = Child;

3、构造器工作模式——临时构造器法(利用空函数来原型继承,父对象不会受到子对象的影响

  function exend(Child,Parent){

    var F = function(){};

    F.prototype = Parent.prototype;

    Child.prototype = new F();

    Child.prototype.constructor = Child;

        child.uber = Parent.prototype;   //可以找到父对象                     =〉 uber在constructor下,即xxx.constructor.uber访问

  }

4、构造器工作模式——原型属性copy法(注意这里不支持引用类型的copy)

  function extend2(Child,Parent){

    var p = Parent.prototype,

      c = Child.prototype;

    for (var i in p){

      c[i] = p [i]

    }

    c.uber = p;                     =>  uber在__proto__下面,即XXX.uber访问

  }

5、对象工作模式——全属性copy法(注意这里不支持引用类型的copy)

  function extendCopy(p){

    var c = {};

    for (var i in p){

      c[i] = p[i];

    }

    c.uber = p;         =>uber就在对象下面,即XXX.uber即可

    return c;

  }

6、对象工作模式——深拷贝法(此方法建议使用hasOwnProperty不会误copy不需要的继承属性,还需要判断是否是对象,若为对象需要进行递归)

  function deepCopy(p,c){
    var c = c || {};
    for (var i in p){
      if (p.hasOwnProperty(i)){

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

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

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

        } else {
          c[i] = p[i];
        }
      }
    }

    c.uber = p;
    return c;

  }

  如何不支持Array.isArray()函数,可以如下实现

  if ( typeof Array.isArray != ‘function‘ ){

    Array.isArray = function(value){

      return Object.prototype.toString.call(value) == ‘[object Array]‘

    }

  }

7、对象工作模式——原型继承法(跟3很像,使用原型链模式)

 function object(o){

  var n,

    F = function(){};

  F.prototype = o;

  n = new F();

  n.uber = o;

  return n;

}

8、对象工作模式——扩展与增强模式(方法7+方法5的结合)

function objectPlus(o,stuff){

  var n,

    F = new function(){};

  F.prototype = o;

  n = new F();

  n.uber = o;

  for ( var i in stuff ){

    n[i] = stuff[i]

  }

  return n;

}

9、对象工作模式——多重继承法(也类似copy继承的形式)

function multi(){

  var n,

    stuff,

    j = 0,

    len = arguments.length;

  for (var j=0,j<len,j++){

    stuff = anguments[j];

    for (var i in stuff){

      if ( stuff.hasOwnProperty(i)){

        n[i] = stuff[i];

      }      

    }

  }

  return n;

}

10、对象工作模式——寄生继承法(调用方法7,原型继承法,使用原型链模式)

function parasite(victim){

  var that = object(victim); 

  that.more = 1;

  return that;

}

11、构造器工作模式——构造器借用法(可以结合方法1使用)

function Child(){

  Parent.apply(this,arguments)       //自身属性的继承

}

Child.prototype = new Parent();          //原型的继承

Child.prototype.constructor = Child;

12、构造器工作模式——构造器借用和属性copy法(结合方法4原型属性copy法)

function Child(){

  Parent.apply(this,arguments)       

}

extend2(Child,Parent)

 

13、构造器工作模式——使用Object.create实现类式继承

function Child(){

  Parent.apply(this,arguments)       

}

Child.prototype = Object.create(Parent.prototype)   //Object.create内部实现就是方法3

 

参考:https://developer.mozilla.org/zh-CN/docs/Web/javascript/Reference/Global_Objects/Object/create

 

以上是关于第六章:继承的主要内容,如果未能解决你的问题,请参考以下文章

第六章 面向对象的程序设计 (3 继承)

第六章 面向对象(高级篇)

201671010146 2017—2《第六章学习感悟》

第六章 类

S2第六章

第六章 Caché 设计模式 原型模式