JS继承

继承大致分为两类:

           ——基于构造器工作模式 

           ——基于对象模式


1、原型链法(仿传统)——使用原型链模式

      child.prototype = new Parent();(会继承对象的自身属性以及原型链上的属性方法)

提示:可以将方法与属性集中可重用的部分迁移到原型链中,将不可重用的部分设置为对象的自身属性


2、仅从原型链继承——原型拷贝模式,所有的对象将共享一个原型对象

child.prototype = Parent.prototype

提示:该模式构建继承关系时,不需构建对象实例,原型链上的查询也较快.但是子对象对原型的修改会影响父对象


3、临时构造器——借用原型链模式

function extend(Child,Parent){

       var F = function(){}

       F.prototype = Parent.prototype

       Child.prototype = new F()

      Child.prototype.constructor = Child

      Child.uber = Parent    //方便子对象访问父对象的属性

}

提示:只继承父对象的原型属性,对于自身属性不继承(即this值中的属性)


4、原型属性拷贝法——基于构造器模式(拷贝属性模式,使用原型模式)

function extend2(Child,Parent){

         var c = Child.prototype

         var p = Parent.prototype

         for(var i in p){

             c[i] = p[i]

        }

        c.uber = p

}


5、全属性拷贝法(浅拷贝)——基于对象模式

function extendCopy(Parent){

       var c = {}

       for(var i in Parent){

            c[i] = Parent[i]

     }

    c.uber = Parent

    return c

}

提示:不能作用于原型属性——属于拷贝模式


6、深拷贝法(同上,在遇到对象类型时重复调用上述函数)

function deepCopy(Parent){

        var c = c || {};

        for(var i in Parent){

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

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

                       deepCopy(p[i])

                  }else{

                   c[i] = p[i]

                    }

          }

          return c

}

提示:所有对象都是值传递


7、原型继承法——基于对象工作模式(使用原型链)

function object( o ){

     function F(){}

     F.prototype = o

      return new F()

}

提示:直接在对象之间构建继承关系


8、扩展与增强模式——基于对象工作模式(使用原型链模式属性拷贝模式)

function objectPlus(oParent,oChild){

      var n 

      function F(){}

      F.prototype = 0Parent

      n=new F()

    for(var i in oParent){

       n[i] = oParent[i]

   }

      return n

}

提示:一次性完成对象的继承与扩展


9、多重继承——基于对象工作模式(属性拷贝)

function multi(){

     var n = {}, stuff

      for(var j =0;j

              stuff [ j ] = arguments [ j ]

              for(var i in stuff ){

                      n[ i ]  = stuff [ i ]

                }

       }

        return n

}

提示:会按照父对象的出现顺序依次对它们执行属性拷贝


10、寄生式继承——基于对象(使用原型链)

function parasite(victim){

     var that = object(victim)

      that.more=1     //添加自己属性

     return that

}

提示:执行相应的对象拷贝,并对其扩展


11、构造器借用——基于构造器模式

   function child(){

      Parent.apply(this,arguments)

}

提示:可以只继承父对象的自身属性,也可和方法1中的结合继承原型(便于继承某个对象的具体属性)


12、构造器借用属性拷贝——使用构造器模式、原型链模式拷贝模式

function child(){

Parent.apply(this,arguments)

extend2(child,parent)

}


代码出自《JavaScript面向对象编程》

你可能感兴趣的:(JS继承)