Js杂谈-单体模式
单体模式的思想:保证一个特定类仅有一个实例,意味着第二次使用同一个类创建新对象的时候,应该得到与第一次所创建对象完全相同的对象。
下面举几个实现的例子
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杂谈-单体模式的更多相关文章
- 如何做JS 单体模式的设计---->>js设计模式<<-------单体模式
		1. 单体模式是js中最基本 单最有用的模式之一,非常常用. 单体模式的基本结构如下: var Person = { name: 'lilu', age:', sayHi: function(){ a ... 
- js设计模式--单体模式
		GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自<松本行弘的程序世界>). ... 
- JS设计模式——5.单体模式
		JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ... 
- js的命名空间 && 单体模式 && 变量深拷贝和浅拷贝 && 页面弹窗设计
		说在前面:这是我近期开发或者看书遇到的一些点,觉得还是蛮重要的. 一.为你的 JavaScript 对象提供命名空间 <!DOCTYPE html> <html> <he ... 
- JS设计模式之单体模式(Singleton)
		单体模式作为一种软件开发模式在众多面向对象语言中得到了广泛的使用,在javascript中,单体模式也是使用非常广泛的,但是由于javascript语言拥有其独特的面向对象方式,导致其和一些传统面向对 ... 
- 使用单体模式设计原生js插件
		----------基于上次写的jquery插件进行改造 http://www.cnblogs.com/GerryOfZhong/p/5533773.html 背景:jQuery插件依赖jQuery ... 
- JS设计模式——5.单体模式(用了这么久,竟全然不知!)
		单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? 1.可以用它来划分命名空间(这个就是就是经常用的了) 2.利用分支技术来封装浏览器之间的差异(这个还真没用过,挺新鲜) 3.借 ... 
- js中箭头函数 及 针对箭头函数this指向问题引出的单体模式
		ES6允许使用“箭头”(=>)定义函数 var f = a = > a //等同于 var f = function(a){ return a; } 如果箭头函数不需要参数或需要多个参数, ... 
- javascript设计模式(单体模式)
		主要内容: js中最基本.应用最广的模式就是单体模式,实现原理是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变更进行访问,确保对象只存在一份实例. 单体模式的特点: 在网页中使用全局变 ... 
随机推荐
- jsp数据显示分页
			从数据库获得数据就不写了,直接写如何进行分页,为了方便,把方法和实体类都写到一个java文件里面了 这只是一种简单的分页方法,肯能会有比较多的bug 这是java里的构造实体类和方法, public ... 
- print 函数用法总结
			1. 字符串和数值类型 >>> print(1) 1 >>> print("Hello World") Hello World 2.变量无论什么 ... 
- python开发面向对象基础:封装
			一,封装 [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性: [封装原则] 1. 将不需要对外提供的内 ... 
- 关系数据库元组关系演算语言ALPHA
			关系演算 :以数理逻辑中的谓词演算为基础 按谓词变元不同分类 1.元组关系演算:以元组变量作为谓词变元的基本对象元组关系演算语言ALPHA2.域关系演算:以域变量作为谓词变元的基本对象域关系演算语言Q ... 
- 前端学习---html基础知识
			HTML基本知识 学习html首先我们先看看HTML本质: web框架本质 我们在学socket,我们创建一个socketserver,然后运行起来,有一个client客户端要连接socket服务端, ... 
- javascript中的类方法、构造方法、原型方法的对比
			如果你已经接触js很久了,那么应该可以看看我总结的是否正确,如果你刚开始学习,那么通过我的总结,你可以更快的区别他们,记得我刚接触js时,这一块反正是模糊了很久! 1,长相的区别: function ... 
- HDFS案例
			shell日志采集 需求说明 点击流日志每天都10T,在业务应用服务器上,需要准实时上传至数据仓库(Hadoop HDFS)上 需求分析 一般上传文件都是在凌晨24点操作,由于很多种类的业务数据都要在 ... 
- zabbix监控MySQL部署实战
			1.部署zabbix监控. 1.1 建用户组和用户 groupadd zabbix useradd -d /home/zabbix -g zabbix -m zabbix passwd zabbix ... 
- Python基础学习七 Excel操作
			python操作excel,python操作excel使用xlrd.xlwt和xlutils模块, xlrd模块是读取excel的,xlwt模块是写excel的,xlutils是用来修改excel的. ... 
- 【原】Coursera—Andrew Ng机器学习—编程作业 Programming Exercise 3—多分类逻辑回归和神经网络
			作业说明 Exercise 3,Week 4,使用Octave实现图片中手写数字 0-9 的识别,采用两种方式(1)多分类逻辑回归(2)多分类神经网络.对比结果. (1)多分类逻辑回归:实现 lrCo ... 
