体是一个用来划分命名空间并将一些相关的属性与方法组织在一起的对象,如果她可以被实例化的话,那她只能被实例化一次(她只能嫁一次,不能二婚)。

单体模式是javascript里面最基本但也是最有用的模式之一。

特点:1. 可以用来划分命名空间,从而清除全局变量所带来的危险或影响。

   2. 利用分支技术来来封装浏览器之间的差异。

     3. 可以把代码组织的更为一体,便于阅读和维护。

单体模式的基本写法:

/* 最基本的单体模式 */
var her = {name: 'Anna',sex: 'women',say: function(){// 一些处理逻辑......
   },doing: function(){// 另一些处理函数......
    }
}

 1. 划分命名空间:

var box = {width: 0,height: 0,getArea: function(){return this.width * this.width; // js中对象成的访问必须是显示的,即this是不能省略的
    },init: function(w, h){// width = w;// height = h;这种方式相当于定义了两个全局变量,(没加var声明的变量为全局变量)// 并不是对对象width和height的赋值// 下面是正确的this.width = w;this.height = h;}
} //box划分了一个命名空间,命名空间里的变量只在空间里有效

上面的单体中的所有的成员以及方法都是公有的(public),也就是在单体的外部可以对她们进行任意的改动(但不能访问其中的局部变量),那为什么说单体提供了一个命名空间呢?

别急,我们接着往下看:

var box = {width:0,height:0,//单体的变量getArea:function(){return width * height;// width,height其实并不是单体的变量,而是在init中定义的全局变量
        }init:function(w,h){width = w;height = h;}
}// init中width,height其实并不是单体的变量
window.onload = function(){var init = box.getArea();alert(init);
}

由于没有对init中的width,height进行初始化,所以会报错,这样改一下:

var box = {width:0,height:0,getArea:function(){return width * height;},init:function(w,h){width = w;height = h;}}
window.onload = function(){width = 0;height = 0;//or box.init(0,0);var init = box.getArea();alert(init);
}

发现可以了,由于init和 getArea所用的width和height并不是归单体所有的变量,而是一个全局变量,所以我们可以在单体外面进行随意调用而不受影响、

var box = {width: 0,height: 0,getArea: function(){return width * height;//js中对象成的访问必须是显示的,即this是不能省略的
        },init:function(w,h){width = w;height = h;}}//这里的width,height其实并不是单体的对象
window.onload = function(){width = 0;height = 0;var width = box.getArea();alert(width);
}

这样写又会报错了,可见我们以上的方式对于全局变量并没有建立起一个命名空间,全局变量为我们带来了危险。所以最上面的写法是对的,我们来验证一下:

var box = {width: 2,height: 2,getArea: function(){return this.width * this.height;/ /js中对象成的访问必须是显示的,即this是不能省略的
        },init:function(w,h){this.width = w;this.height = h;}}
window.onload = function(){width = 0; // 不会影响单体中的局部变量也就是命名空间height = 0; // 不会影响单体中的局部变量也就是命名空间var width = box.getArea();alert(width);
}

可见在window.onload中的width 和height已经没有干扰了,因为单体为单体中的width和height建立了一个命名空间。

2. 成员的属性:

虽然在javascript中没有这么严格的面向对象(oop),但是我们可以借助闭包来进行一个模仿,毕竟有的变量设为public是很不好的。

var her = (function(){var name  = 'Anna';var sex = 'women';return {getArea: function(){return name + 'is a'  + sex;},init:function(b){name = b;}}
})();window.onload = function(){her.name = 'Jock'; // 无法访问
    alert(ger.getArea());her.init('Lous');alert(her.getArea());
}

私有变量、方法是只读的,公有变量、方法是可读可写的。

访问:
对于私有成员,直接访问即可,前面不用加任何修饰,
对于公有的访问在单体作用域内前面要加上“this.”,在单体作用域外前面要加上“her.”(单体名字.)

3.利用分支技术来来封装浏览器之间的差异

注意的地方:

  a. 一定要用闭包,实现即时绑定

  b. 每个分支之间用分号隔开

  c. 最后返回的是分支的名字

  d. 调用的时候用单体名+分支的方法名;

// 利用单体的分支技术来定义XHR(XMLHttpRequest)对象,必须要用闭包才可以实现
var XHR = (function(){//The three branchesvar standard = {cXHR:function(){return new XMLHttpRequest();}    };var activeXNew = {cXHR:function(){return new ActiveXObject('Msxml2.XMLHttp');}    };var activeXOld = {cXHR:function(){return new ActiveXObject('Microsoft.XMLHttp');}    };//To assign(分配) the branch, try each method;return whatever doesn't failvar testObject;try{testObject = standard.cXHR();return standard;// return this branch if no error was thrown }catch(e){try{testObject = activeXNew.cXHR();return activeXNew;}catch(e){try{testObject = activeXOld.cXHR();return activeXOld;}catch(e){throw new Error('Create the XMLHttpRequestObject failed!');    }}}
})();
window.onload = function(){alert(XHR.cXHR());
}

共同进步吧!!!话说又星期五了

转载于:https://www.cnblogs.com/beyond-succeed/p/5856109.html

javascript --- 设计模式之单体模式(一)相关推荐

  1. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  2. Javascript 设计模式之代理模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之代理模式[讲师辅导]-969人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  3. Javascript 设计模式之外观模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之外观模式[讲师辅导]-770人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  4. JavaScript设计模式-享元模式

    JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...

  5. javaScript几种设计模式之一——单体模式

    javaScript是一种弱类型.动态的.基于原型的语言,这种语言特性使得它非常容易. 甚至是普通的方式实现其中的一些模式. 单体模式的思想在于保证一个特定类仅有一个实例.这就意味着当您第二次使用同一 ...

  6. JavaScript设计模式总结-组合模式

    使用场景 1.对象存在整体-部分的结构,如树.数组等: 2.使用者希望对数据结构中的所有对象统一处理. 需要注意的是 1.组合模式所谓的结构并非"继承",而是"包含&qu ...

  7. java 懒加载模式_JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

    我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Jav ...

  8. Javascript设计模式之——代理模式

    最近在读<javascript设计模式与开发实践>,在这里把文中的各种设计模式写出来,以便加深记忆,也可以分享给初学者.如果你不了解设计模式,那么强烈推荐你阅读一下这本书,相信它可以颠覆你 ...

  9. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索"为什么MVC不是一种设计模式呢?"其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composi ...

  10. 详细介绍javascript中的单体模式singleton(全面)

    一.单体模式描述 1.单体模式是javascript中最基本但又最有用的模式之一,他可能比其他任何模式都常用. 2.这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的 ...

最新文章

  1. C-#数据库方面好书
  2. BT[2]-BLE初体验:心率计
  3. 【JQuery】 触发元素的change事件
  4. #1081 : 最短路径·一(Dijkstra)
  5. 关于dlg和pro的问题
  6. 从CLR GC到CoreCLR GC看.NET Core为云而生
  7. JPA 2.1实体图–第1部分:命名实体图
  8. 华为云服务器安装win10系统,云服务器可以安装win10吗
  9. python 定时器_python定时器apscheduler及一个django的小tips
  10. python学习之最常用的内置函数
  11. c++ const限定符
  12. 大数据之-Hadoop3.x_MapReduce_排序概述---大数据之hadoop3.x工作笔记0114
  13. 电子科技大学要多少分才能录取?
  14. php联合查询的前提条件,PHP生成HTML前提条件及原理介绍_PHP教程
  15. IntelliJ IDEA 记学习笔《装阿里代码规范插件》
  16. Postman调接口时获取Chrome浏览器Cookie数据携带发送
  17. MySQL数据库微信h5棋牌搭建详解
  18. Boost Log : Trivial logging
  19. 如何将页脚(footer)保持在页面底部
  20. 梦幻哪个服务器最多牛人,梦幻西游:盘点经久不衰的十大火区!你所在的服务器是否上榜?...

热门文章

  1. “电脑开的热点手机连接不上”的问题寻解过程记录
  2. 关于ip、pv、uv的概念
  3. 81章 老子1章到_三曜道长解读道德经: 信言不美 第81章
  4. linux udp 端口 抓包,Linux系统-tcpdump常用抓包命令
  5. 记:应聘赛意 测试工程师
  6. python数据可视化第三章图表辅助元素的定制
  7. HSC-1th 2022 Writeup
  8. vsftp日志文件汉字_为何手机存储空间还没用就快满了?删掉这些隐藏冗余文件满血复活...
  9. 九宫格摆法_九宫格照片墙摆法,9张照片墙6竖3横怎么摆?
  10. 统计检测(statistical tests)