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

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

  1. var Girl1 = {
  2. name:"昭君",
  3. age:33,
  4. showName:function(){
  5. alert("我的名字是:" + this.name);
  6. },
  7. bathe:function(){
  8. console.log("我是" + this.name + ",我在洗澡!");
  9. }
  10. }
  11. console.log("Girl.age=" +Girl1.age);
  12. Girl1.bathe();

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

  1. //使用下划线表示法
    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();

javascript设计模式-单体模式的更多相关文章

  1. 读书笔记之 - javascript 设计模式 - 单体模式

    单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次. 单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问 ...

  2. JavaScript设计模式——单体模式

    一:单体模式简介: 是什么:将代码组织为一个逻辑单元,这个单元中的代码通过单一的变量进行访问.只要单体对象存在一份实例,就可以确信自己的所有代码使用的是同样的全局资源. 用途:1.用来划分命名空间,减 ...

  3. 设计模式-单体模式(C++)

    设计模式-单体模式 单体模式在使用非常方便,适合于单一的对象,例如全局对象的抽象使用. 需要注意的是单体模式不可继承 // 实现 Singleton.h #ifndef __SINGLETON_H__ ...

  4. js设计模式--单体模式

    GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自<松本行弘的程序世界>). ...

  5. javascript 设计模式-----策略模式

    在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...

  6. JavaScript设计模式 - 迭代器模式

    迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...

  7. JavaScript设计模式 - 代理模式

    代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问 代理模式的用处(个人理解):为了保障当前对象的单一职责(相对独立性),而需要创建另一个对象来处理调用当前对象之前的一些逻辑以提高代码的效 ...

  8. javascript中单体模式的实现

    单体模式作为一种软件开发模式在众多面向对象语言中得到了广泛的使用,在javascript中,单体模式也是使用非常广泛的,但是由于javascript语言拥有其独特的面向对象方式,导致其和一些传统面向对 ...

  9. 读书笔记之 - javascript 设计模式 - 代理模式

    代理(proxy)是一个对象,它可以用来控制对另一对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替本体被实例化,并使其可被远程访 ...

随机推荐

  1. SAP computer之program counter

    Program counter The program is stored in memory with the first instruction at binary address 0000, t ...

  2. CMMI评估流程

    原文链接:http://www.cmmcn.com/new/cmmi-105.html 当前位置:首页 >> CMMI知识库 >> CMMI相关 >> CMMI评估 ...

  3. C/C++关键字

    1. static关键字 作用 在函数体内静态变量具有记忆功能.在函数体内定义的静态变量离开时不会被清除,在下次函数调用的时候其值保持不变. 限制变量或函数的使用范围.static修饰的全局变量或者函 ...

  4. idea搭建第一个springboot

    1.打开idea开发工具,在菜单栏选择File-->New-->Project...-->Spring Initializer说明:社区版的idea是没有Spring Initial ...

  5. shell 结合expect实现ssh登录并执行命令

    #!/bin/bash ips=( '127.0.0.1' ) ;i<${#ips[*]};i++)) do expect <<EOF #这里的 expect <<EOF ...

  6. 【剑指Offer】4、重建二叉树

      题目描述:   输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列 ...

  7. java环境搭建心得

     右击此电脑,点击属性, 在打开的电脑系统对话框里发电机i直接点击左侧导航里的[高级系统设置]在打开的电脑系统属性对话框里直接点击下面的[环境变量] 打开环境变量对话框后,直接点击系统变量下面的新建, ...

  8. [模板]FFT

    郝神并没有令我明白这个. 但是巨神的题解太强了. #include <iostream> #include <complex> #include <cmath> # ...

  9. Linux挂载NAS共享文件夹

    [root@ftp:/mnt] > mount -o username=user01,password=1234567890 //192.168.31.20/share /mnt/nas [ro ...

  10. salt 根据ip修改主机名

    首先定义pillar [root@web1 pillar]# cat hostname.sls ip_hostname: 10.1.1.1: web1 10.1.1.2: web2 10.1.1.3: ...