轻松掌握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之锁定表格栏位
Jun 29 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 03 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
May 24 Javascript
javascript中关于break,continue的特殊用法与介绍
May 24 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
Jan 07 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
Nov 01 Javascript
vue实现图片加载完成前的loading组件方法
Feb 05 Javascript
小程序根据手机机型设置自定义底部导航距离
Jun 04 Javascript
简单了解微信小程序的目录结构
Jul 01 Javascript
js动态获取时间的方法分析
Aug 02 Javascript
vuex vue简单使用知识点总结
Aug 29 Javascript
小程序如何自主实现拦截器的示例代码
Nov 04 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php ios推送(代码)
2013/07/01 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
了解一点js的Eval函数
2012/07/26 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
python实现定时播放mp3
2015/03/29 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
浅析Python四种数据类型
2018/09/26 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
python装饰器使用实例详解
2019/12/14 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
关于Django Models CharField 参数说明
2020/03/31 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
工厂厂长的职责
2013/12/12 职场文书
党的群众路线调研报告
2014/11/03 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS