js设计模式--单体模式
GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自《松本行弘的程序世界》).
单体模式:
单体(Singleton)模式的思想在于保证一个特定类仅有一个实例。当在第二次使用同一个类创建新对象的时候,和第一次创建对象完全相同对象。
当使用new语法通过构造函数来创建对象,仅仅获得的是指向完全相同的对象的新指针:
例:
function uniFn(){}; var uni1 = new uniFn(); var uni2 = new uniFn(); uni1.constructor === uni2.constructor; //true 指向的是同一个构造函数
使用对象字面量创建一个单体:
var obj = { first:"单体",
two:function(){} };
js中是没有类的概念,只有对象。当创建一个新对象的时,实际上没有其他对象与其类似,新对象已经是单体了。
var obj1 = { first:"单体", two:function(){} }; var obj2 = { first:"单体", two:function(){} }; obj1 == obj2; //false 即便是创建完全相同成员的同类对象,他们也是不想等的。
obj1 === obj2; //false
通过闭包实现单体的方法,这个秘诀在与重写构造函数:
function example(){
//缓存实例
var instans = this; this.name = "_this";
//重写构造函数
example = function(){ return instans; };
}; var exa = new example(); var exa2 = new example(); console.log(exa == exa2); //true console.log(exa == exa2);//true
如果需要使原型和构造函数指针按照预期的那样运行,可以通过调整实现这个目标:
function example(){ //缓存实例
var instans; //重写构造函数
example = function(){ return instans; };
//保留原型属性
example.prototype = this;
//实例
instans = new example();
//重置构造函数指针
instans.constructor = example; //功能 this.name = "_this";
return instans;
}; example.prototype.nothing = true; var exa = new example(); example.prototype.evething = true; var exa2 = new example(); console.log(exa === exa2); //true //所有属性都起作用 console.log(exa.nothing && exa2.evething && exa.nothing && exa2.evething); //true //构造函数的指针 console.log(exa.constructor === example) //true
理解的并不够深刻,总结一遍,加强不少印象。
参考《javascript模式》
腾讯web前端团队:http://www.alloyteam.com/2012/10/common-javascript-design-patterns/
js设计模式--单体模式的更多相关文章
- 如何做JS 单体模式的设计---->>js设计模式<<-------单体模式
1. 单体模式是js中最基本 单最有用的模式之一,非常常用. 单体模式的基本结构如下: var Person = { name: 'lilu', age:', sayHi: function(){ a ...
- 设计模式-单体模式(C++)
设计模式-单体模式 单体模式在使用非常方便,适合于单一的对象,例如全局对象的抽象使用. 需要注意的是单体模式不可继承 // 实现 Singleton.h #ifndef __SINGLETON_H__ ...
- JavaScript设计模式——单体模式
一:单体模式简介: 是什么:将代码组织为一个逻辑单元,这个单元中的代码通过单一的变量进行访问.只要单体对象存在一份实例,就可以确信自己的所有代码使用的是同样的全局资源. 用途:1.用来划分命名空间,减 ...
- 读书笔记之 - javascript 设计模式 - 单体模式
单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次. 单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问 ...
- Js杂谈-单体模式
单体模式的思想:保证一个特定类仅有一个实例,意味着第二次使用同一个类创建新对象的时候,应该得到与第一次所创建对象完全相同的对象. 下面举几个实现的例子 1.new操作符 这种思想在于当使用同一个构造函 ...
- javascript设计模式-单体模式
场景:假设有一个Girl(美女)实体,该实体拥有姓名.年龄两个属性,拥有显示姓名和洗澡两个方法,下面分步骤构造该实体. 1.用简单基本单体模式: var Girl1 = { name:"昭君 ...
- js设计模式--迭代器模式
迭代器模式: 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示.js中我们经常会封装一个each函数用来实现迭代器. 理解的意思:提供一个方法,去把对象的每一项按 ...
- JS设计模式——工厂模式详解
它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ...
- 浅谈js设计模式 — 命令模式
命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦 ...
随机推荐
- OpenGL ES
前言 OpenGL ES是Khronos Group创建的一系列API中的一种(官方组织是:http://www.khronos.org/).在桌面计算机上有两套标准的 3DAPI:Direct3D和 ...
- android studio 更新失败解决办法
在andriod studio目录下找到studio.exe.vmoptions这个文件,用记事本打开,在后面加上 -Djava.net.preferIPv4Stack=true -Didea.upd ...
- VS2010下创建的VB.NET项目打包发布安装包的流程
VS2010下创建的VB.NET项目打包发布安装包的流程 参考:http://blog.csdn.net/liuyanlinglanq/article/details/8609675 关于relea ...
- Cocos2d-x 的“HelloWorld” 深入分析
本节所用Cocos2d-x版本:cocos2d-1.0.1-x-0.12.0 不能免俗,一切都从“HelloWorld!”开始.打开HelloWorld工程,里面有两个文件目录Classes和win3 ...
- C# new和override的区别
浅析C# new和override的区别 C#中new和override是继承中经常用到的两个关键字,但是往往有时候容易把这两个关键字的作用搞混淆. new C# new关键字表示隐藏,是指加上new ...
- MySQL5.6-Tomcat7环境变量的配置
一.MySQL环境变量配置(zip安装):系统-高级系统设置--环境变量--path添加D:\Mysql\bin 找到mysql解压目录下的my-default.ini文件修改 basedir = D ...
- TCP carries HTTP data in order, and without corruption
wTCP/IP承载几乎所有的HTTP通信. HTTP The Definitive Guide
- 11.TCP的交互数据流
TCP报文段一般有两类,分别是成块数据和交互数据. 1.交互式输入 Rlogin连接上键入一个交互命令的数据流如下图所示. 每一个交互按键都会产生一个数据分组,每次从客户传 ...
- awakeFromNib与initWithCoder
- JAVA中获取当前运行的类名,方法名,行数
JAVA中获取当前运行的类名,方法名,行数 public static String getTraceInfo(){ StringBuffer sb = new StringBuffer(); Sta ...