学习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 相关文章推荐
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
JavaScript Event学习第五章 高级事件注册模型
Feb 07 Javascript
JQuery处理json与ajax返回JSON实例代码
Jan 03 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 Javascript
jsp 自动编译机制详细介绍
Dec 01 Javascript
Vue.js实现文章评论和回复评论功能
May 30 Javascript
详解vue slot插槽的使用方法
Jun 13 Javascript
javascript定时器取消定时器及优化方法
Jul 08 Javascript
JS面向对象之单选框实现
Jan 17 Javascript
vue 实现一个简单的全局调用弹窗案例
Sep 10 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
Nov 19 Javascript
vue 递归组件的简单使用示例
Jan 14 Vue.js
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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
php中处理模拟rewrite 效果
2006/12/09 PHP
一段php加密解密的代码
2007/07/16 PHP
php连接mysql数据库代码
2009/03/10 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
javascript实现拖放效果
2015/12/16 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
浅谈python中截取字符函数strip,lstrip,rstrip
2015/07/17 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
Python for i in range ()用法详解
2020/09/18 Python
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
安全生产中长期规划实施方案
2014/02/21 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
工作检讨书大全
2015/01/26 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python