月丶
js创建对象与继承方式
2022-3-30 月丶


粗略记录下自己理解的创建对象与继承模式



创建对象



1、工厂模式



    在函数内部新建对象,在新建对象上创建属性方法,然后返回对象,此模式为函数方法,并非构造函数



2、构造函数模式



    使用构造函数创建对象,每次都会创建自己的方法,无法做到方法的复用




3、原型模式



    所有实例的属性方法会共用,没有单独方法




4、组合构造与原型模式



    结合构造函数模式和原型模式优点,去除确定,在构造函数中实现单独属性,在原型上添加共用方法




5、动态原型模式



    在组合构造与原型模式的基础上,将写在原型上的方法,放在构造函数内部,通过判断方法是否存在的情况来动态添加方法,此处注意在原型添加方法不可使用字面量形式。这个其实主要就是优化封装方式




6、寄生构造函数模式



    类似工厂模式,区别在于工厂模式并非构造函数,此模式在构造函数中进行,与一般构造函数不同,这里显式返回了创建的对象




7、稳妥构造函数模式



    不使用this,new等,与工厂模式比较相似








继承方式



1、借用构造函数继承



    不能方法复用




2、原型式继承



    所有属性方法会共享,在只要有一个实例改动应用数据属性后,所有实例都会改变




3、组合继承



    结合构造函数继承和原型式继承的有点,构造函数内部继承超集的属性,原型继承超集的方法




    function Sub(){

        Super.call(this)(第二次)

    }




    Sub.protoType = new Super() (第一次)

    Sub.protoType.constructor = Sub

    唯一问题就是会调用两次超集的构造函数




4、寄生式继承



    与工厂模式类似,创建需要继承的超集副本,然后在创建的对象上添加自己的方法,最后返回对象




5、寄生组合式继承



    在组合继承方式的基础上添加寄生思想,创建超集原型副本,将子集原型指向当前副本,让后将子集constructor指向自己



    function inhertPrototype(Sub,Super){

        var prototype = Object.create(Super.prototype)

        prototype.constructor = Sub



        Sub.prototype = prototype

    }



    然后用该方法替换3中的子集原型赋值的地方(即第一次那里)



    此继承方式实际就是把组合继承的两次调用超集构造函数减少成了一次

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容