• 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);

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

  • 相关阅读:
    ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)
    ROS Learning-014 learning_tf(编程) 坐标系变换(tf)广播员 (Python版)
    2019-05-12 Jave学习日记之运算符&if语句
    2019-05-11 Jave学习日记之进制运算&数据类型
    OpenSession与getCurrentSession的区别
    Hibernate----Hibernate小配置
    Hibernate----配置文件Hibernate.cfg.xml
    SpringMVC
    WebService
    Javamail
  • 原文地址:https://www.cnblogs.com/gresic/p/3393191.html
Copyright © 2020-2023  润新知