JavaScript设计模式之单例模式原理与用法实例分析

本文实例讲述了JavaScript设计模式之单例模式原理与用法。分享给大家供大家参考,具体如下:

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式是一种常用的模式,有些对象只需要一个,如线程池、全局缓存、浏览器中的window对象等,这时候可以用到单例模式。

单例模式典型的应用场景:单击按钮时,页面中会出现一个登陆浮窗,而该登录浮窗是唯一的,无论单击多少次按钮,这个浮窗都会被创建一次,则适合用单例模式创建。

全局变量不是单例模式,但在JavaScript开发中,经常会把全局变量当成单例来使用。

使用var a = {};这种方式创建对象a时,对象a是独一无二的,若变量a被声明在全局作用域下,则可以在代码的任何位置使用这个变量。这显然满足单例模式的两个条件。

但是全局变量存在很多问题,很容易造成命名空间污染,如上面的var a = {};随时有可能被覆盖。

有必要尽量减少全局变量的使用,即使需要,也应该把它的污染降到最低。

降低全局变量带来的命名污染的几种方式:

1) 使用命名空间

适当地使用命名空间,并不会杜绝全局变量,但可以减少全局变量的数量。

把a和b都定义为namespace的属性,这样可以减少变量和全局作用域打交道的机会:

var namespace = {
 a: function() {
  alert("a");
 },
 b: function() {
  alert("b");
 }
};

动态地创建命名空间:

var obj = {};
obj.namespace = function(name) {
 var tips = name.split('.');
 var cur = obj;
 for (var i in tips) {
  if (!cur[tips[i]])
   cur[tips[i]] = {};
  cur = cur[tips[i]];
 }
};
obj.namespace('name');
obj.namespace('birth.year');
console.dir(obj);

上述代码等价于:

var obj = {
 name: {},
 birth: {
  year: {}
 }
};

2) 使用闭包封装私有变量

var person = (function() {
 var_name = "Alice";
 var _id = 16;
 return {
  getUserInfo: function() {
   return _name + ": " + _id;
  }
 }
})();

使用下划线来约定私有变量_name和_age,它们被封装在闭包产生的作用域中,外部是访问不到这两个变量的,这就避免了对全局的命令污染。

惰性单例模式:

在需要的时候才创建对象实例。

var createBox = (function() {
 var div;
 return function() {
  if (!div) {
   div = document.createElement('div');
   div.innerHTML = '登录';
   div.style.display = 'none';
   document.body.appendChild(div);
  }
  return div;
 }
})();
document.getElementById('btn').onclick = function() {
 var box = createBox();
 box.style.display = 'block';
};

用变量div来判断是否已经创建过浮窗。

通用的惰性单例:

问题:上面的惰性单例实例是违反单一职责原则的,创建对象和管理单例的逻辑都放在createBox对象内部。若下次要创建页面中唯一的iframe,需要把createBox几乎照抄一遍。

var createIframe = (function() {
 var iframe;
 return function() {
  if (!iframe) {
   iframe = document.createElement('iframe');
   document.body.appendChild(iframe);
   return iframe;
  }
  return div;
 }
})();

解决:把不变的部分隔离出来,其实,管理单例的逻辑可以完全抽象出来,因为它们的逻辑是一样的:用一个变量来标记是否创建过对象,若是,则在下次直接返回已经创建好的对象。

var createSingle = function(func) {
 var flag;
 return flag || (flag = func.apply(this, arguments));
};
var createBox = function() {
 var div = document.createElement('div');
 div.innerHTML = '登录';
 div.style.display = 'none';
 document.body.appendChild(div);
 return div;
};
document.getElementById('btn').onclick = function() {
 var box = createBox();
 box.style.display = 'block';
};
var createIframe = createSingle(function() {
 var iframe = document.createElement('iframe');
 document.body.appendChild(iframe);
 return iframe;
});
document.getElementById('btn').onclick = function() {
 var iframe = createIframe();
 iframe.style.display = 'block';
};

单例模式的其他用途:

单例模式的用途远不止于创建对象,比如click事件只需要在第一次渲染页面时绑定一次,显然运用jQuery的one()方法可以实现。若运用createSingle 方法,也很容易实现:

var createSingle = function(func) {
 var flag;
 return flag || (flag = func.apply(this, arguments));
};
var bindEvent = createSingle(function() {
 document.getElementById(‘div').onclick = function() {
  ...
 };
 return true;
});
var render = function() {
 bindEvent();
};
render();
render();
render();

render()函数与bindEvent()函数执行了3次,但div实际上只被绑定了一次。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

(0)

相关推荐

  • javascript 中模板方法单例的实现方法

    javascript 中模板方法单例的实现方法 模板方法单例 模板方法的定义:父类中定义一组操作算法骨架,将一些实现步骤延伸到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤. 代码块 html部分,例如: <div id="content"></div> js部分,例如: //格式化字符串方法 function fromateString(str, data) { return str.replace(/\{#(\w+)#\}/g,

  • JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能

    本文实例讲述了JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能.分享给大家供大家参考,具体如下: 单例模式 单例模式的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点." 单例模式定义:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." var Singleton

  • 原生Javascript和jQuery做轮播图简单例子

    接触jquery也有一段时间了,今天刚好利用轮播图来练练手.博文的前面会介绍一个简单用jquery做轮播图的例子,中间会插入一些关于轮播图更多的思考,在后面会用Javascript的方法来写一个轮播图,最后则是关于jquery和Javascript的比较. jquery做轮播图的例子: html部分代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>轮

  • NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】

    本文实例讲述了NodeJS设计模式.分享给大家供大家参考,具体如下: 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直接返回,若不存在,则创建实例对象,并将实例对象保存在静态变量中,当下次请求时,则可以直接返回这个对象实例,这就确保了一个类只有一个实例对象.举个例子吧~一间学校刚刚起建还没有图书馆,有的同学就向领导提意见:"hey! 哥们,能不能帮我们建一个图书馆? "(想要一个图书馆实例),然后领导说:"no pro

  • [js高手之路]单例模式实现模态框的示例

    什么是单例呢? 单,就是一个的意思.例:就是实例化出来的对象,那合在一起就是保证一个构造函数只能new出一个实例,为什么要学习单例模式呢?或者说单例模式有哪些常见的应用场景.它的使用还是很广泛,比如:弹出一个模态框,一般来说在网站中弹出的模态框,不停的一直点击,一般只能创建一个.还有后台的数据库连接,一般都是保证一个连接等等.今天的主题就是单例在模态框中的应用,我们先要搞清楚,怎么弄个单例出来. 我们先看下普通的构造函数加原型方式.下面这种是常见的方式 function Singleton (

  • JavaScript设计模式之单例模式简单实例教程

    本文实例讲述了JavaScript设计模式之单例模式.分享给大家供大家参考,具体如下: 一.单例模式概念 单例就是保证一个类只有一个实例,实现方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象. 二.单例模式的作用和注意事项 模式作用: 1.模块间通信 2.系统中某个类的对象只能存在一个 3.保护自己的属性和方法 注意事项: 1.注意th

  • 轻松掌握JavaScript单例模式

    定义:保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点: 实现原理:利用闭包来保持对一个局部变量的引用,这个变量保存着首次创建的唯一的实例;  主要用于:全局缓存.登录浮窗等只需要唯一一个实例的时候: 一. 为一个非单例模式对象(如:Demo)实现单例模式的方法:  给Demo添加一个静态方法来实现单例: Demo.getSingle = (function(){ var demo = null; return function(name){ if(!demo){ demo = ne

  • 基于JavaScript实现单例模式

    首先,了解一下什么是单例模式,这里我直接把菜鸟教程中的定义给copy过来: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象. 注意: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一

  • JavaScript设计模式之单例模式原理与用法实例分析

    本文实例讲述了JavaScript设计模式之单例模式原理与用法.分享给大家供大家参考,具体如下: 单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有些对象只需要一个,如线程池.全局缓存.浏览器中的window对象等,这时候可以用到单例模式. 单例模式典型的应用场景:单击按钮时,页面中会出现一个登陆浮窗,而该登录浮窗是唯一的,无论单击多少次按钮,这个浮窗都会被创建一次,则适合用单例模式创建. 全局变量不是单例模式,但在JavaScript开发中,经

  • javascript设计模式 – 代理模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 代理模式原理与用法.分享给大家供大家参考,具体如下: 介绍:代理使我们很常见的一众模式,proxy,nginx都称之为代理,代理是什么意思呢?代理模式在客户端和目标对象之间加入一个新的代理对象,代理对象起到一个中介作用,去掉客户不能看到的内容和服务,或者增添客户需要的额外服务. 定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用.代理模式是一种对象结构型模式. 场景:我们还是以画图形为例,我将所有的绘图动作包装到Shape类中,使用代理

  • javascript设计模式 – 外观模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 外观模式原理与用法.分享给大家供大家参考,具体如下: 介绍:外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,隐藏系统复杂度,降低子系统与客户端的耦合度. 定义: 为子系统中的一组接口提供一个统一的入口.外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 场景:我们还是用画圆的方式来介绍下外观模式. 示例: var Rectangle = func

  • javascript设计模式 – 迭代器模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 迭代器模式原理与用法.分享给大家供大家参考,具体如下: 介绍:迭代器模式是一种使用频率非常高的设计模式,通过引入迭代器,可以将数据的遍历功能从聚合对象中分离出来.迭代器模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor).迭代器模式是一种对象行为型模式. 场景:我们做一个百家姓的迭代器 示例: function NameRepository(){

  • javascript设计模式 – 解释器模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 解释器模式原理与用法.分享给大家供大家参考,具体如下: 介绍:之前在做java开发时,数据库的增删改查特别频繁,并且场景不同需要用到的SQL语句页都不同,如何用调用方法的形式来使用sql语句,拼接sql?这就是这一节我们要讲的解释器模式. 定义:定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的语言是指使用规定格式和语法的代码.解释器模式是一种类行为型模式. 场景:我们实现一个解释器,用来判断传递的数字是奇数还是偶数,是正数还是负数

  • javascript设计模式 – 命令模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 命令模式原理与用法.分享给大家供大家参考,具体如下: 介绍:命令模式是一种数据驱动的设计模式,将请求以命令的形式包裹在对象中,并传递给调用对象.命令模式的核心在于引入了命令类,通过命令类来降低发送者和接受者的耦合度. 定义:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式. 场景:我们通过

  • javascript设计模式 – 策略模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 策略模式原理与用法.分享给大家供大家参考,具体如下: 介绍:策略模式中可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法.在这里,每一种算法的封装都可以称之为一种策略.策略模式的主要目的是将算法的定义与使用分开. 定义:定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换.策略模式让算法独立与使用它的客户而变化,也称为政策模式.策略模式是一种对象行为型模式. 场景:使用策略模式实现一个加减乘除的工具类,将四个算法进行封装. 示

  • javascript设计模式 – 备忘录模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 备忘录模式原理与用法.分享给大家供大家参考,具体如下: 介绍:在我们的开发中偶尔会遇到这样一种情况,需要对用户的行为进行撤销.要想实现撤销,首先需要保存软件系统的历史状态,当用户执行撤销时用之前的状态覆盖当前状态.本节介绍的备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便的回到一个特定的历史步骤. 定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态,它是一种对象行为模式,

  • javascript设计模式 – 状态模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 状态模式原理与用法.分享给大家供大家参考,具体如下: 介绍:状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.状态模式将一个对象的状态从该对象中分离出来,使得对象状态可以灵活变化. 定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,其别名为状态对象,状态模式是一种对象行为型模式. 场景:在很多情况下我们的页面需要做一些状态判断,是否注册,是否登录,剩余金额是否大于500等等,我们通常是在组件中通过if

  • javascript设计模式 – 访问者模式原理与用法实例分析

    本文实例讲述了javascript设计模式 – 访问者模式原理与用法.分享给大家供大家参考,具体如下: 介绍:访问者模式比较复杂,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对他们进行不同的访问操作.访问者模式的主要目的是将数据结构与数据操作相分离. 定义:提供一个作用于某对象结构中的个元素的操作表示,它使得可以再不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式是一种对象行为型模式 场景:使用PC结构demo来解释下访问者模式 示

随机推荐