轻松掌握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 相关文章推荐
Js获取事件对象代码
Aug 05 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
Feb 03 Javascript
解决json日期格式问题的3种方法
Feb 02 Javascript
jquery中$each()方法的使用指南
Apr 30 Javascript
详解vue-router基本使用
Apr 18 Javascript
two.js之实现动画效果示例
Nov 06 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
Nov 17 Javascript
jquery层次选择器的介绍
Jan 18 jQuery
详解Vue用cmd创建项目
Feb 12 Javascript
24行JavaScript代码实现Redux的方法实例
Nov 17 Javascript
JavaScript实现简单验证码
Aug 24 Javascript
如何制作自己的原生JavaScript路由
May 05 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
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
thinkphp分页集成实例
2017/07/24 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
web页面数据展示新想法(json)
2010/06/08 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python实现批量修改文件名代码
2017/09/10 Python
python生成n个元素的全组合方法
2018/11/13 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
HTML5实现预览本地图片
2016/02/17 HTML / CSS
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
大专生自我鉴定范文
2013/10/01 职场文书
大学生求职信范文应怎么写
2014/01/01 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
卖车协议书范例
2014/09/16 职场文书
2014年组织部工作总结
2014/11/14 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
教师节感谢信
2015/01/22 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
捐书仪式主持词
2015/07/04 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android