学习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 相关文章推荐
ext监听事件方法[初级篇]
Apr 27 Javascript
jquery的选择器的使用技巧之如何选择input框
Sep 22 Javascript
node.js中的console用法总结
Dec 15 Javascript
在父页面得到zTree已选中的节点的方法
Feb 12 Javascript
11种ASP连接数据库的方法
Sep 18 Javascript
JavaScript常用函数工具集:lao-utils
Mar 01 Javascript
Javascript中内建函数reduce的应用详解
Oct 20 Javascript
Ajax验证用户名或昵称是否已被注册
Apr 05 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
jquery实现图片跟随鼠标的实例
Oct 17 jQuery
vue + vuex todolist的实现示例代码
Mar 09 Javascript
Vue使用v-viewer实现图片预览
Oct 21 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
一个SQL管理员的web接口
2006/10/09 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
python数组复制拷贝的实现方法
2015/06/09 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
对python生成业务报表的实例详解
2019/02/03 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
建筑文秘专业个人求职信范文
2013/12/28 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
2014年学生会工作总结
2014/11/07 职场文书
部队2014年终工作总结
2014/11/27 职场文书
离婚上诉状范文
2015/05/23 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书
图解上海144收音机
2021/04/22 无线电
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python
Android中的Launch Mode详情
2022/06/05 Java/Android
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers