学习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轻松实现Ajax的实例代码
Aug 16 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Apr 01 Javascript
JavaScript实现文字跟随鼠标特效
Aug 06 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
Jul 20 Javascript
javascript实现瀑布流动态加载图片原理
Aug 12 Javascript
Ajax的概述与实现过程
Nov 18 Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 Javascript
使用SVG基本操作API的实例讲解
Sep 14 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 Javascript
微信小程序 textarea 层级过高问题简单解决方案
Oct 14 Javascript
微信小程序实现多图上传
Jun 19 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引用效率问题分析
2012/03/23 PHP
很让人受教的 提高php代码质量36计
2012/09/05 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
phalcon框架使用指南
2016/02/23 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
一句话JavaScript表单验证代码
2009/08/02 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
python实现飞机大战微信小游戏
2020/03/21 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
python字符串循环左移
2019/03/08 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
数据管理员的自我评价分享
2013/11/15 职场文书
大学信息公开实施方案
2014/03/09 职场文书
感恩父母的演讲稿
2014/05/06 职场文书
导游词之日本富士山
2020/01/06 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
Python访问Redis的详细操作
2021/06/26 Python