JS继承

作者: CollinHsu | 来源:发表于2017-03-28 15:55 被阅读0次

    继承大致分为两类:

               ——基于构造器工作模式 

               ——基于对象模式


    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<arguments.length;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继承

          本文链接:https://www.haomeiwen.com/subject/rtmjottx.html