学习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插件制作 图片走廊 gallery
Aug 17 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
Feb 26 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
Jun 19 Javascript
js解决movebox移动问题
Mar 29 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
May 05 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
May 17 Javascript
jQuery位置选择器用法实例分析
Jun 28 jQuery
vue项目中引入Sass实例方法
Aug 27 Javascript
小程序新版订阅消息模板消息
Dec 31 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
Feb 15 Javascript
vue+elementUI 实现内容区域高度自适应的示例
Sep 26 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
XAMPP安装与使用方法详细解析
2013/11/27 PHP
php生成短网址示例
2014/05/05 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
文字垂直滚动之javascript代码
2015/07/29 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
python处理文本文件并生成指定格式的文件
2014/07/31 Python
python执行get提交的方法
2015/04/29 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
python读取和保存图片5种方法对比
2018/09/12 Python
python中bytes和str类型的区别
2019/10/21 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
T3官网:头发造型工具
2019/12/26 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
优秀大学生推荐信范文
2013/11/28 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
商标侵权律师函
2015/05/27 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server