学习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 相关文章推荐
javascript编程起步(第六课)
Feb 27 Javascript
Jquery数字上下滚动动态切换插件
Aug 08 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
Nov 17 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
Jul 24 Javascript
8 行 Node.js 代码实现代理服务器
Dec 05 Javascript
浅谈javascript的闭包
Jan 23 Javascript
JavaScript实现按键精灵的原理分析
Feb 21 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
Jul 24 Javascript
iview table高度动态设置方法
Mar 14 Javascript
微信小程序云开发实现数据添加、查询和分页
May 17 Javascript
layui默认选中table的CheckBox复选框方法
Sep 19 Javascript
Antd下拉选择,自动匹配功能的实现
Oct 24 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
如何开发一个虚拟域名系统
2006/10/09 PHP
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python实现的数据结构与算法之链表详解
2015/04/22 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
优秀部门获奖感言
2014/02/14 职场文书
公司营业员的自我评价
2014/03/04 职场文书
师德师风演讲稿
2014/05/05 职场文书
涨价通知
2015/04/23 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
教师外出学习心得体会
2016/01/18 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers