学习JavaScript设计模式之单例模式


Posted in Javascript onJanuary 19, 2016

一、定义

保证一个类仅有一个实例,并提供一个访问它的全局访问点。
当单击登陆按钮,页面中出现一个登陆浮窗,这个登陆浮窗是唯一的,无论单击多少次登陆按钮,这个浮窗都只会被创建一次,那么这个登陆浮窗就适合用单例模式来创建。

二、实现原理

要实现单例并不复杂,使用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。

三、假单例

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

var a = {};

降低全局变量带来的命名污染
(1)使用命名空间

var namespace1 = {
  a: function(){},
  b: 2
}

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

var user = (function() {
  var _name = 'lee',
    _age = '25';
  return {
    getUserInfo: function() {
      return _name + ":" + _age;
    }
  };
})();

四、惰性单例:在需要的时候才能创建对象实例

var getSingle = function(fn) {
  var result;
  return function() {
    return result || (result = fn.apply(this, arguments));
  };
};

// 测试
function testSingle(){}
getSingle(testSingle)() === getSingle(testSingle)();  // true

五、补充:

(1)懒加载

var lazyload = function() {
  console.log(1);
  lazyload = function() {
    console.log(2);
  }
  return lazyload();
}

lazyload();

(2)预加载

var preload = (function() {
  console.log(1);
  preload = function() {
    console.log(2);
  };
  return preload;
})();

preload();

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

Javascript 相关文章推荐
仿jQuery的siblings效果的js代码
Aug 09 Javascript
Javascript Objects详解
Sep 04 Javascript
重写document.write实现无阻塞加载js广告(补充)
Dec 12 Javascript
javascript动态修改Li节点值的方法
Jan 20 Javascript
jQuery和AngularJS的区别浅析
Jan 29 Javascript
JS特效实现图片自动播放并可控的效果
Jul 31 Javascript
跟我学习javascript的call(),apply(),bind()与回调
Nov 16 Javascript
AngularJS中过滤器的使用与自定义实例代码
Sep 17 Javascript
PHP获取当前页面完整URL的方法
Dec 02 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
遍历json获得数据的几种方法小结
Jan 21 Javascript
记一次webapck4 配置文件无效的解决历程
Sep 19 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
Jan 19 #Javascript
学习JavaScript设计模式之装饰者模式
Jan 19 #Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 #Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
Jan 19 #Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 #Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
Jan 19 #Javascript
学习JavaScript设计模式之享元模式
Jan 18 #Javascript
You might like
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
javascript编程起步(第四课)
2007/01/10 Javascript
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
Python创建临时文件和文件夹
2020/08/05 Python
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
国庆节标语大全
2014/10/08 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python