学习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 相关文章推荐
图片上传即时显示缩略图的js代码
May 27 Javascript
html中table数据排序的js代码
Aug 09 Javascript
Js+Flash实现访问剪切板操作
Nov 20 Javascript
js模仿jquery的写法示例代码
Jun 16 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
Dec 06 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
javascript实现简单查找与替换的方法
Jul 22 Javascript
JavaScript中的Repaint和Reflow用法详解
Jul 27 Javascript
element ui里dialog关闭后清除验证条件方法
Feb 26 Javascript
原生JS实现的简单轮播图功能【适合新手】
Aug 17 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
Jun 24 Javascript
小程序和web画三角形实现解析
Sep 02 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
加强版phplib的DB类
2008/03/31 PHP
PHP SQLite类
2009/05/07 PHP
PHP的博客ping服务代码
2012/02/04 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
javascript History对象原理解析
2020/02/17 Javascript
Python os模块学习笔记
2015/06/21 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
详解Python的三种可变参数
2019/05/08 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
python装饰器使用实例详解
2019/12/14 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
法律专业自我鉴定
2013/10/03 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
体育委员竞选稿
2015/11/21 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
导游词之太原天龙山
2020/01/02 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python