• JavaScript面向对象编程之创建方式


    最近一直在看Nicholas C.Zakas的《JavaScript高级程序设计》

    看到面向对象编程时,就自己连抄带编总结了一下。

    如果有错误或者不妥的地方还请斧正。

    一、工厂模式

    function Bicycle(color,price){
        var newBicycle=new Object;
        newBicycle.color=color;
        newBicycle.price=price;
        newBicycle.showInfo=function(){
            alert(this.color+','+this.price);
        };
        return newBicycle;
    }
    //实例对象
    var oBicycle1=new Bicycle('black',10000);
    var oBicycle2=new Bicycle('white',20000);

    该模式存在的问题:

    1.语义上,看起来不像使用带有构造函数的new运算符那么正规。
    2.功能上,每次调用Bicycle,都要创建新的函数showInfo。

    二、工厂模式改进

    function Bicycle(color,price){
        var newBicycle=new Object;
        newBicycle.color=color;
        newBicycle.price=price;
        newBicycle.showInfo=showInfo;
        return newBicycle;
    }
    //把方法放在外面
    function showInfo(){
        alert(this.color+','+this.price);
    }
    
    //实例对象
    var oBicycle1=new Bicycle('black',10000);
    var oBicycle2=new Bicycle('white',20000);

    该方式解决了重复创建对象函数的问题,但是函数看起来不像是对象的方法

    三、构造函数方式

    function Bicycle(color,price){
        this.color=color;
        this.price=price;
        this.showInfo=showInfo;
    }
    //把方法放在外面
    function showInfo(){
        alert(this.color+','+this.price);
    }
    
    //实例对象
    var oBicycle1=new Bicycle('black',10000);
    var oBicycle2=new Bicycle('white',20000);

    该方式虽然语义上没有太大问题了,还是没有解决方法看起来不像对象的方法的问题

    四、原型方式

    function Bicycle(){
        Bicycle.prototype.color='red';
        Bicycle.prototype.price=10000;
        Bicycle.prototype.showInfo=function(){
            alert(this.color+','+this.price);
        };
    }
    //实例对象
    var oBicycle1=new Bicycle();
    var oBicycle2=new Bicycle();

    该方式:解决了(一)中的两个问题

    最大的问题:对象共享,如果改变oBicycle1的颜色,那么oBicycle2的值也将随之改变

    五、混合的构造函数/原型方式

    1.用构造函数定义属性,原型方式定义方法(函数)
    2.这样所有的函数都只创建一次,每个对象都有自己的对象属性实例

    function Bicycle(color,price){
        this.color=color;
        this.price=price;
    }
    Bicycle.prototype.showInfo=function(){
        alert(this.color+','+this.price);
    };
    //实例对象
    var oBicycle1=new Bicycle('red',10000);
    var oBicycle2=new Bicycle('green',20000);

    六、动态原型方式--我是第一次听说

    1.把方法放进构造函数中,使用判断让方法只创建一次

    2.整理过后的代码和Java的类看起来就很像

    function Bicycle(color,price){
        this.color=color;
        this.price=price;
        if(typeof Bicycle._initialized=="undefined"){
            Bicycle.prototype.showInfo=function(){
                alert(this.color+','+this.price);
            };
            Bicycle._initialized=true;
        };
    }
    var oBicycle1=new Bicycle("red",10000);

    总结:目前最常用的是混合的构造函数/原型方式,不过以后自己会尝试用一下第六种方式

  • 相关阅读:
    BZOJ1070: [SCOI2007]修车(最小费用最大流,思维)
    CF892D—Gluttony(思维,好题)
    BZOJ1005--[HNOI2008]明明的烦恼(树的prufer编码)
    HDU–5988-Coding Contest(最小费用最大流变形)
    【转】HDU 6194 string string string (2017沈阳网赛-后缀数组)
    【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路
    HDU6513/CCPC2017--A Secret(KMP)
    8.19-星期五
    CodeForces–830B--模拟,树状数组||线段树
    js实现360度图片旋转
  • 原文地址:https://www.cnblogs.com/gresic/p/3393191.html
Copyright © 2020-2023  润新知