• javascript设计模式-单体模式


    场景:假设有一个Girl(美女)实体,该实体拥有姓名、年龄两个属性,拥有显示姓名和洗澡两个方法,下面分步骤构造该实体。

    1、用简单基本单体模式:

    var Girl1 = {
        name:"昭君",
        age:33,
        showName:function(){
            alert("我的名字是:" + this.name);
        },
        bathe:function(){
            console.log("我是" + this.name + ",我在洗澡!");
        }
    }
    console.log("Girl.age=" +Girl1.age);
    Girl1.bathe();

    问题:美女的名字和洗澡这么隐私的是不能随便被访问的吧,那就要用到(私用成员的单体

    //使用下划线表示法
    1
    var Girl2 = { 2 name:"昭君", 3 _age:33, 4 showName:function(){ 5 console.log("我的名字是:" + this.name); 6 }, 7 _bathe:function(){ 8 console.log("我是" + this.name + ",我在洗澡!"); 9 } 10 } 11 console.log("Girl2.name=" +Girl2.name);//Girl3.name=昭君 12 console.log("Girl2.age=" +Girl2.age); //Girl.age=undefined 13 Girl2.showName();//我的名字是:昭君 14 Girl2.bathe();//Uncaught TypeError: Gird2.bathe is not a function

    问题:如果我很猥琐,在洗澡的方法前面加一个下横线,那不是偷窥成功了吗?快使用闭包吧

     1 //使用闭包
     2 var Gird3 = (function(){
     3     var age = 33;
     4     function bathe(){
     5         console.log("我是" + this.name + ",我在洗澡!");
     6     }
     7     return {
     8         name:"昭君",
     9         showName:function(){
    10             console.log("我的名字是:" + this.name);
    11         }
    12     }
    13 })();
    14 console.log("Girl3.name=" +Gird3.name);//Girl3.name=昭君
    15 console.log("Girl3.age=" +Gird3.age); //Girl.age=undefined
    16 Gird3.showName();//我的名字是:昭君
    17 Gird3.bathe();//Uncaught TypeError: Gird3.bathe is not a function

    结果:完美

    但是,美女是用来怜惜的,没事儿的时候可别随便拿出来秀哟,那我们就用惰性加载吧!!!

     1 //惰性实例化
     2 var Gird4 = (function(){
     3     var girl = null;
     4     function constructor(){
     5         var age = 33;
     6         function bathe(){
     7             console.log("我是" + this.name + ",我在洗澡!");
     8         }
     9         return {
    10             name:"昭君",
    11             showName:function(){
    12                 console.log("我的名字是:" + this.name);
    13             }
    14         }
    15     }
    16     return {
    17         getInstance:function(){
    18             if(girl) return girl;
    19             return constructor();
    20         }
    21     }
    22     
    23 })();
    24 Gird4.getInstance().showName();
  • 相关阅读:
    我的第一个可用的Windows驱动完成了
    据说是一种很古老的方法
    起一卦,测今天工作,问题不少
    起一卦,找房子,马上没房子住了
    哈哈哈哈,我竟然发现了个MSDN里面的笔误
    起一卦,看现在我的工程进度怎么样。
    起卦帮同学看工作,应了。
    2012年10月17日帮朋友算得第一卦
    2013年1月13日帮朋友测的第二卦,有些地方没看出来
    bzoj2588 Spoj 10628. Count on a tree
  • 原文地址:https://www.cnblogs.com/tengri/p/5277400.html
Copyright © 2020-2023  润新知