学习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倒计时代码
Aug 12 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
May 26 Javascript
AngularJS+Node.js实现在线聊天室
Aug 28 Javascript
AngularJS基础 ng-selected 指令简单示例
Aug 03 Javascript
JavaScript动态检验密码强度的实现方法
Nov 09 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 Javascript
Bootstrap table使用方法记录
Aug 23 Javascript
原生JS实现Ajax跨域请求flask响应内容
Oct 24 Javascript
基于滚动条位置判断的简单实例
Dec 14 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
Jul 06 Javascript
Emberjs 通过 axios 下载文件的方法
Sep 03 Javascript
node.js制作一个简单的登录拦截器
Feb 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判断浏览器、判断语言代码分享
2015/03/05 PHP
深入php内核之php in array
2015/11/10 PHP
各种快递查询--Api接口
2016/04/26 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
javascript读取RSS数据
2007/01/20 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
jquery选择器中的空格与大于号>、加号+与波浪号~的区别介绍
2016/06/24 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
python获取本地计算机名字的方法
2015/04/29 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
银行个人求职自荐信范文
2013/12/16 职场文书
家居饰品店创业计划书
2014/01/31 职场文书
旅游文化节策划方案
2014/06/06 职场文书
图书馆标语
2014/06/19 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
开除通知书范本
2015/04/25 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
html粘性页脚的具体使用
2022/01/18 HTML / CSS