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:"昭君 ...
随机推荐
- GDB深入研究
GDB深入研究 一.GDB代码调试 (一)GDB调试实例 在终端中编译一个示例C语言小程序,保存到文件 gdb-sample.c 中,用GCC编译之 #include <stdio.h> ...
- 《Linux及安全》实验安排
SEED(SEcurity EDucation)项目由雪城大学杜文亮教授2002年创立,为计算机教学提供一套信息安全实验环境,目前已开发超过30个实验,涵盖广泛的安全原理,被全世界数百个高校采用. 实 ...
- 5332盛照宗 如何获取新技能+c语言学习调查
如何获取新技能+c语言学习调查 你有什么技能比大多人(超过90%以上)更好? 如果问我有没有什么技能比大多数人,并且是90%的人好,我还真不敢说有,因为世界上有70亿人,要比63亿人做的好才行啊.我也 ...
- 上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。
用libUSB来实现自己的驱动+下位机理论速度.=1M字节每秒. 达到极限速度 WINDOWS已经自带虚拟串口驱动,只不过还需要一个Inf文件 方法1:直接下载一个串口inf,来修改文件. 方 ...
- 内置模块加载器(commonjs规范)的使用
index9.html <html><head> <title>模块加载器</title> <script src="jquery-1. ...
- Graphics samples2
为图形填充渐变色: Graphics2D g2=(Graphics2D)g; GradientPaint gra=new GradientPaint(20, 20, Color.BLUE, 100,8 ...
- java5中原子型操作类的应用
java.util.concurrent.atomic包中提供了对基本数据类型,对数组中的基本数据类型和类中的基本数据类型的操作.详情见API. 下面实例简单介绍AtomicInteger类的使用: ...
- SQLHelper用到的配置文件格式
格式要牢记 <configuration> <connectionStrings> <add name="dbConnStr" connectionS ...
- Spring-事物传播行为
spring事物的传播属性(7种) REQUIRED(默认) 业务方法需要在一个容器里运行.如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务. 存在事物,则使用当前事物 ...
- @SuppressWarnings含义
J2SE 提供的最后一个批注是 @SuppressWarnings.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默. @SuppressWarnings 批注允许您选择 ...