javascript单体模式
单体模式的思想在于保证一个特定类仅有一个实例。这意味着当第二次使用同一个类创建的新对象的时候,应该得到与第一个所创建的对象完全相同。
javacript中并没有类,因此对单体咬文嚼字的定义严格来说并没有意义。但是javascript具有new语法可使用构造函数来创建对象,而且有时需要使用这种语法的单体实现。这种思想在于当使用同一个构造函数以new操作符来创建多个对象时,应该仅获得指向完全相同的对象的新指针。
下面的代码显示了其预期行为:
var nui = new Universe();
var nui2 = new Universe();
nui === nui2; //结果为true
上面例子中,uni对象仅在第一次调用构造函数时被创建。在第二次创建时会返回同一个对象。这就是为什么nui === nui2,我们可以写出2种做法。
静态属性中的实例
下面代码是一个在Universe构造函数静态属性中缓存单个实例的列子:
function Universe(){ //如果有实例,返回出去
if(typeof Universe.instance === 'object'){
return Universe.instance;
}
this.start_time = 0;
this.bang = 'Big'; //缓存
Universe.instance = this;
}
//测试
var nui = new Universe();
var nui2 = new Universe();
console.log( nui === nui2); //结果为true
正如你所看到的,这种做法的缺点在于instance是公开的。虽然其他代码不太可能会无意中修改该属性,但是仍有这种可能。
闭包中的实例
另外一种实现类似于类的单体方法是采用闭包来保护单个实例。
代码如下:
function Universe(){ //缓存实例
var instance = this; this.start_time = 0;
this.bang = 'Big'; Universe = function(){
return instance;
}
}
//测试:
var uni = new Universe();
var uni2 = new Universe();
console.log( uni == uni2 ); //结果为tur
这种做法会丢失所有在初始定义和重定义时刻时间添加到它里面的属性。这里的特定情况下,任何添加到Universe的原型中的对象都不会存在指向由原始实现所创建实例的活动连接。
通过下面一些测试,可以看到这个问题:
向原型添加属性
Universe.prototype.nothing = true;
var uni = new Universe();
Universe.prototype.everything = true;
var uni2 = new Universe();
开始测试:
仅有最初的原型
连接到对象上
console.log(uni.nothing); //结果为true
console.log(uni2.nothing); //结果为true console.log(uni.everything); //结果为undefined
console.log(uni2.everything); //结果为undefined 结果看上去是正确的
console.log( uni.constructor.name ); //结果为Universe
console.log( uni.constructor === Universe); //结果为false
之所以uni.constructor不再与Universe()构造函数相同,是因为nui.constructor仍然指向了原始的构造函数,而不是重新定义的那个构造函数。
从需求上来说,如果需要使用原型和构造函数指针按照预期的那样运行,那么可以通过做一些调试来实现这个目标:
function Universe(){ //缓存实例
var instance; //重写构造函数
Universe = function Universe(){
return instance;
} //保留原型属性
Universe.prototype = this; //实例
instance = new Universe(); //重置构造函数指针
instance.constructor = Universe; //所有功能
instance.start_time = 0;
instance.bang = 'Big'; return instance;
} //更新原型并创建实例
Universe.prototype.nothing = true; //结果为true
var uni = new Universe();
Universe.prototype.everything = true; //结果为true
var uni2 = new Universe(); //相同的实例
console.log( uni === uni2 ); //结果为true //所有原型属性
console.log( uni.nothing && uni.everything && uni2.nothing && uni2.everything ); //结果为true //构造函数指针正确
console.log( uni.constructor === Universe); //结果为true
一个对象字面量创建一个简单的对象也是一个单体的例子:
var obj = {
myprop : 'my value'
};
var obj2 = {
myprop : 'my value'
}; console.log( obj === obj2 ); //false
console.log( obj == obj2 ); //false
javascript单体模式的更多相关文章
- javascript --- 设计模式之单体模式(一)
单体是一个用来划分命名空间并将一些相关的属性与方法组织在一起的对象,如果她可以被实例化的话,那她只能被实例化一次(她只能嫁一次,不能二婚). 单体模式是javascript里面最基本但也是最有用的模式 ...
- javascript中单体模式的实现
单体模式作为一种软件开发模式在众多面向对象语言中得到了广泛的使用,在javascript中,单体模式也是使用非常广泛的,但是由于javascript语言拥有其独特的面向对象方式,导致其和一些传统面向对 ...
- 读书笔记之 - javascript 设计模式 - 单体模式
单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次. 单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问 ...
- javascript设计模式(单体模式)
主要内容: js中最基本.应用最广的模式就是单体模式,实现原理是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变更进行访问,确保对象只存在一份实例. 单体模式的特点: 在网页中使用全局变 ...
- javascript设计模式之单体模式
一入前端深似海,刚入前端,以为前端只是div+css布局外加jquery操作DOM树辣么简单.伴随着对前端学习的深入,发现前端也是博大精深,而且懂得越多,才发现自己越无知,所以一定不能停下脚步的学习. ...
- JavaScript设计模式——单体模式
一:单体模式简介: 是什么:将代码组织为一个逻辑单元,这个单元中的代码通过单一的变量进行访问.只要单体对象存在一份实例,就可以确信自己的所有代码使用的是同样的全局资源. 用途:1.用来划分命名空间,减 ...
- Javascript设计模式(2)-单体模式
单体模式 1. js最简单的单体模式 对象字面量:把一批有一定关联的方法和属性组织在一起 // 对象字面量 var Singleton = { attr1: true, attr2: 10, meth ...
- JavaScript中的单体模式四种实现方式
/* 1 简单单体 */ var Singleton = { attr1: 1 , method1:function(){ //do sth } }; alert(Singleton.attr1); ...
- javascript设计模式-单体模式
场景:假设有一个Girl(美女)实体,该实体拥有姓名.年龄两个属性,拥有显示姓名和洗澡两个方法,下面分步骤构造该实体. 1.用简单基本单体模式: var Girl1 = { name:"昭君 ...
随机推荐
- js浮点数精确计算(加、减、乘、除)
<SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加 ...
- 20135220谈愈敏Linux_总结
Linux_总结 具体博客链接 计算机是如何工作的 操作系统是如何工作的 构造一个简单的Linux系统MenuOS 系统调用(上) 系统调用(下) 进程的描述和创建 可执行程序的装载 进程的切换和系统 ...
- 《android基于andFix的热修复方案》思路篇
1:需求背景 项目上线之后,发现BUG需要修复(比如安卓兼容性等测试难以发现的问题),频繁的更新影响用户体验 2:方案要求 静默下载,耗费流量少,打完补丁后立刻生效,不用重启apk 3:解决思路 3. ...
- 服务器网站报错:由于扩展配置问题无法提供您请求的页面,请添加MIME映射,针对mp4,flv文件类型无法打开。
确保IIS正常 服务器增加mp4格式的MIME 类型映射设置的具体步骤是: “开始” > “控制面板” > “管理工具” >“Internet 信息服务(IIS管理器)”,“MIME ...
- iOS开发小技巧--父子控制器练习中get到的技能,控制核心动画的范围
一.未经过处理的动画是这样的,自定义的导航按钮也一起跟着转起来了. 二.自己想要的效果 三.实现这种效果的思想:核心动画要添加到view的layer上面,刚开始的情况是讲核心动画添加到了整个大view ...
- WPF控件--利用Winform库中的NotifyIcon实现托盘小程序
WPF控件--NotifyIcon 运行界面如下所示: 图1 图2 代码很少,如下所示 ...
- zabbix_agent安装(Centos+Ubuntu)
Centos安装 安装依赖包 yum -y install mysql-devel libcurl-devel net-snmp-devel 添加用户 groupadd zabbix use ...
- BZOJ SCOI2005骑士精神
裸IDA*,ans从1到15循环来限制搜索深度. #include<cstdio> #include<cstring> #include<algorithm> us ...
- [转]window.opener用法
window.opener 实际上就是通过window.open打开的窗体的父窗体. 比如在父窗体parentForm里面 通过 window.open("subForm.html" ...
- jQuery技术交流资料
jQuery技术交流资料https://www.zybuluo.com/jikeytang/note/65371