学习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 闭包疑问
Dec 30 Javascript
jQuery判断元素是否是隐藏的代码
Apr 24 Javascript
在浏览器窗口上添加遮罩层的方法
Nov 12 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
Apr 26 Javascript
使用javascript控制cookie显示和隐藏背景图
Feb 12 Javascript
js判断iframe内的网页是否滚动到底部触发事件
Mar 18 Javascript
javascript中AJAX用法实例分析
Jan 30 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
May 26 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
VUE长按事件需求详解
Oct 18 Javascript
angular2中Http请求原理与用法详解
Jan 11 Javascript
vue循环中点击选中再点击取消(单选)的实现
Sep 10 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导出生成word的方法
2015/12/25 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
input输入框的自动匹配(原生代码)
2013/03/19 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
python实现360皮肤按钮控件示例
2014/02/21 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
Python 切分数组实例解析
2019/11/07 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
计算机专业个人求职自荐信
2013/09/21 职场文书
单位更名证明
2015/06/18 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
Mysql 文件配置解析介绍
2022/05/06 MySQL