轻松掌握JavaScript单例模式


Posted in Javascript onAugust 25, 2016

定义:保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点;
实现原理:利用闭包来保持对一个局部变量的引用,这个变量保存着首次创建的唯一的实例; 
主要用于:全局缓存、登录浮窗等只需要唯一一个实例的时候; 

一. 为一个非单例模式对象(如:Demo)实现单例模式的方法:
 给Demo添加一个静态方法来实现单例:

Demo.getSingle = (function(){
  var demo = null;
  return function(name){
    if(!demo){
      demo = new Demo(name);
    }
    return demo;
  }
})();

用法: 
非单例模式:var a = new Demo('Peter'); 
单例模式:

var b1 = Demo.getSingle('Peter');
var b2 = Demo.getSingle('Sufei');
b1 === b2;//true,都引用的是new Demo('Peter')

通过代理类来实现单例:

var ProxyDemo = (function(){
  var demo = null;
  return function(name){
    if(!demo){
      demo = new Demo(name);
    }
    return demo;
  }
})();

用法: 
非单例模式:var a = new Demo('Peter');
单例模式:var b = new ProxyDemo('Peter'); 

二. 惰性单例模式:只在需要的时候才创建该单例; 
以下是通用惰性单例的创建方法:

var getSingle = function(foo){
  var single = null;
  return function(){
    return single || (single = foo.apply(this,arguments));
  }
};

用法:

var createLoginLayer = function(){
  var frag = document.createDocumentFragment();
  var div = document.createElement('div');
  div.style.display = 'none';
  //以下给div添加其它登录元素
  ...
  document.body.appendChild(frag.appendChild(div));
  return div;
}
var createSingleLoginLayer = getSingle(createLoginLayer);
//当用户第一次点击按钮(id = 'lgBtn')时,来创建并显示登录窗口,之后重复点击按钮不会重复创建;
document.getElementById('lgBtn').onclick = function(){
  var lg = createSingleLoginLayer();
  lg.style.display = 'block';
}

附:缓存函数的计算结果,如计算一个数的数列 
以下是不缓存的写法,非常慢!

function foo(n){
  results = n < 2 ? n : foo(n - 1) + foo(n - 2);
  return results;
}
console.log(foo(40));//得计算好几秒

以下是缓存写法,基本瞬间出结果!

var cache = {};
function foo(n){
  if(!cache[n]){
    cache[n] = n < 2 ? n : foo(n - 1) + foo(n - 2);
  }
  return cache[n];
}
console.log(foo(100));

更好的写法:

var foo = (function(){
  var cache = {};
  return function(n){
    if(!cache[n]){
      cache[n] = n < 2 ? n : foo(n - 1) + foo(n - 2);
    }
    return cache[n];
  };
})();
console.log(foo(100));

参考文献:
 《JavaScript模式》
 《JavaScript设计模式与开发实践》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在javascript将NodeList作为Array数组处理的方法
Jul 09 Javascript
Script的加载方法小结
Jan 12 Javascript
分享一个常用的javascript静态类
Dec 31 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
Aug 04 Javascript
js实现带有介绍的Select列表菜单实例
Aug 18 Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 Javascript
angularjs 表单密码验证自定义指令实现代码
Oct 27 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
Dec 08 Javascript
关于angular js_$watch监控属性和对象详解
Apr 24 Javascript
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
跨域解决之JSONP和CORS的详细介绍
Nov 21 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
Mar 06 Javascript
很酷的星级评分系统原生JS实现
Aug 25 #Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
Aug 25 #Javascript
轻松掌握JavaScript策略模式
Aug 25 #Javascript
Javascript 6里的4个新语法
Aug 25 #Javascript
Javascript实现代码折叠功能
Aug 25 #Javascript
深入浅出ES6之let和const命令
Aug 25 #Javascript
PhotoSwipe异步动态加载图片方法
Aug 25 #Javascript
You might like
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
PHP 数据结构 算法 三元组 Triplet
2011/07/02 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
基于jQuery的日期选择控件
2009/10/27 Javascript
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
Angular排序实例详解
2017/06/28 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
python3多线程知识点总结
2019/09/26 Python
爱普生美国官网:Epson美国
2018/11/05 全球购物
基层工作经历证明
2014/01/13 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
暑期培训心得体会
2014/09/02 职场文书
2014年政教处工作总结
2014/12/20 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
HAM-2000摩机图
2021/04/22 无线电
MySQL 逻辑备份 into outfile
2022/05/15 MySQL