单体模式的思想:保证一个特定类仅有一个实例,意味着第二次使用同一个类创建新对象的时候,应该得到与第一次所创建对象完全相同的对象。

下面举几个实现的例子

1.new操作符

这种思想在于当使用同一个构造函数以new操作符来创建多个对象,应该仅获得指向完全相同的对象的新指针。

var uni = new Universe();
var uni2 = new Universe();
uni === uni2 //true

2.静态属性中的实例

function Universe(){
if(typeof Universe.instance === 'object'){
return Universe.instance;
}
this.a = '单体';
Universe.instance = this;
} var uni = new Universe();
var uni2 = new Universe();
uni === uni2 //true

实例化的时候,先判断是否拥有实例,如果第一次实例化将跳过if判断,第二次实例化的时候,判断Universe的instance属性值是存在的,所以返回的是第一次实例化的结果。显然,这种方式的关键是使用全局变量来存储实例。当然使用全局变量的方式,弊端是非常明显的。

3.闭包中的实例

通过私有成员实现

function Universe(){
var instance = this;
this.a = '单体';
Universe = function(){
return instance;
};
} var uni = new Universe();
var uni2 = new Universe();
uni === uni2 //true

函数里返回函数,内部函数本身具有访问外部函数成员的权利,这是闭包的一次个人show。同样我们走一次测试代码。
第一次实例化时,重写了Universe构造函数,返回的是this。从某种角度说,这种模式跟new很像,也有区别。相同都是new了Universe构造函数,不同在于实例化一次,就重写一次Universe构造函数。看到这里,这种实现方式的弊端也就显示出来了。看如下测试代码:

Universe.prototype.nothing = true;
var uni = new Universe();
Universe.prototype.everything = true;
var uni2 = new Universe(); uni.nothing//true
uni2.nothing//true uni.everything //undefined
uni2.everything //undefined

因为这种模式,每次实例化时,构造函数都被重写,所以此Universe.prototype非彼Universe.prototype。
看看下面一种模式是如何解决的

3.修改版

 function Universe(){
//缓存实例
var instance;
//重写构造函数
Universe = function(){
return instance;
};
//保留原型属性
Universe.prototype = this;
//实例
instance = new Universe();
//重置构造函数指针
instance.constructor = Universe;
//所有功能
instance.bang = 'big';
return instance;
}

我们重新走一下之前版本的测试代码
1.在Universe的原型上添加nothing属性。

2.第一次实例化时,uni继承了Universe原型上的所有成员,之后重写构造函数,并将新的Universe的原型的指针置成uni。这样实例化之前的旧Universe原型上的成员就能转移到新的Universe的原型上了。

3.在新的Universe的原型上添加everything属性

4.第二次实例化时,过程跟2相同。

这样。从开始的Universe的原型上的成员通过Universe.prototype = this,在每次实例化时转移给新的重写的Universe的原型上。

4.另一种解决方案。(即时函数)

var Universe;
(function(){
var instance;
Universe = function Universe(){
if(instance){
return instance;
}
instance = this;
this.a = '单体';
}
}())

这种方案用了即时函数和闭包。在第一次调用构造函数时,它会创建一个对象。并且使得私有instance指向该对象。从第二次调用之后,该构造函数仅返回该私有变量。个人觉得。模式4和模式3是提供两种不错的解决思路。重写构造函数,通过闭包保存第一次初始化的对象。便于以后使用。
东西不多,时间刚好。以上是本人学习感悟,有不对的地方请园友指正,大家共同学习进步。

JavaScript是一座冰山,我所知道的只是冰山一角。

Js杂谈-单体模式的更多相关文章

  1. 如何做JS 单体模式的设计---->>js设计模式<<-------单体模式

    1. 单体模式是js中最基本 单最有用的模式之一,非常常用. 单体模式的基本结构如下: var Person = { name: 'lilu', age:', sayHi: function(){ a ...

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

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

  3. JS设计模式——5.单体模式

    JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html   单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...

  4. js的命名空间 && 单体模式 && 变量深拷贝和浅拷贝 && 页面弹窗设计

    说在前面:这是我近期开发或者看书遇到的一些点,觉得还是蛮重要的. 一.为你的 JavaScript 对象提供命名空间 <!DOCTYPE html> <html> <he ...

  5. JS设计模式之单体模式(Singleton)

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

  6. 使用单体模式设计原生js插件

    ----------基于上次写的jquery插件进行改造  http://www.cnblogs.com/GerryOfZhong/p/5533773.html 背景:jQuery插件依赖jQuery ...

  7. JS设计模式——5.单体模式(用了这么久,竟全然不知!)

    单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? 1.可以用它来划分命名空间(这个就是就是经常用的了) 2.利用分支技术来封装浏览器之间的差异(这个还真没用过,挺新鲜) 3.借 ...

  8. js中箭头函数 及 针对箭头函数this指向问题引出的单体模式

    ES6允许使用“箭头”(=>)定义函数 var f = a = > a //等同于 var f = function(a){ return a; } 如果箭头函数不需要参数或需要多个参数, ...

  9. javascript设计模式(单体模式)

    主要内容: js中最基本.应用最广的模式就是单体模式,实现原理是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变更进行访问,确保对象只存在一份实例. 单体模式的特点: 在网页中使用全局变 ...

随机推荐

  1. mysql的账号管理

    mysql的账号管理 最先匹配 user 表(包含:用户列 权限列 安全列 资源控制列)连接判断:host  user password字段(user的授权是全局的): 然后匹配db表:如果只是给指定 ...

  2. mysql导入导出表结构

    mysql导入导出表结构 导出整个库的表结构如下:mysqldump -uroot -p -d databasename > createtab.sql 如果只想导出表: test1,test2 ...

  3. MySQL模式匹配(LIKE VS REGEXP)

    3.3.4.7. 模式匹配 MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi.grep和sed的扩展正则表达式模式匹配的格式. SQL模式匹配允许你使用“_”匹配任何单个字符, ...

  4. 2017中国大学生程序设计竞赛 - 女生专场(Graph Theory)

    Graph Theory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  5. PTA 畅通工程之最低成本建设问题(30 分)(最小生成树 krusal)

    畅通工程之最低成本建设问题(30 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路 ...

  6. mysql设计与开发

    架构设计表结构设计索引sql语句1.表结构设计的核心思想是什么?容量评估,性能优化,硬件升级,垂直拆分,水平拆分 2.有个大表为了一个查询(一天就查2次),领导要你建索引(索引空间大小有500G),你 ...

  7. [机器学习]numpy broadcast shape 机制

    最近在做机器学习的时候,对未知对webshell检测,发现代码提示:ValueError: operands could not be broadcast together with shapes ( ...

  8. js实现的点击div区域外隐藏div区域

    首先看下JS的事件模型,JS事件模型为向上冒泡,如onclick事件在某一DOM元素被触发后,事件将跟随节点向上传播,直到有click事件绑定在某一父节点上,如果没有将直至文档的根. 阻止冒泡:1.对 ...

  9. C Primer Plus学习笔记(十)- 字符串和字符串函数

    getchar() 和 putchar() getchar() 函数不带任何参数,它从输入队列中返回下一个字符 下面的语句读取下一个字符输入,并把该字符的值赋给变量 ch ch =getchar(); ...

  10. activemq安装运行及其在springboot中的queue和topic使用

    安装activemq 运行 springboot使用 依赖 配置 Producer Consumer ComsumerTopic 使用 安装activemq http://activemq.apach ...