JavaScript中的单例模式是最常用的、最基本的设计模式,它提供了一种命名空间,减少全局变量泛滥的代码管理机制;

1、最常见的单例模式:

[javascript] view plain copy

 
  1. //一般用function定义的类,我才会采用首字母大写的方法来约定这个变量为类
  2. //而对于这种伪类,我通常习惯于使用驼峰式命名法
  3. var singleton = {
  4. attr1: '',
  5. attr2: '',
  6. method1: function() {},
  7. method2:  function() {}
  8. };

这是JavaScript开发中最常用的代码组织方式,这种方式在JavaScript执行的时候,就已经创建了实例对象。这样创建的实例对象,所有的属性、方法都是公开的,有一定的风险;一般使用这样的单例模式,我们可以采用下划线_来命名私有变量,来约定为私有变量。但是很不靠谱!

2、闭包方法的单例模式:

[javascript] view plain copy

 
  1. var singleton = (function() {
  2. var _a, _b;    //私有变量
  3. var that = {}; //new某个类
  4. //公开接口
  5. that.getA = function() {
  6. return _a;
  7. };
  8. that.setA = function(a) {
  9. _a = a;
  10. };
  11. that.getB = function() {
  12. return _b;
  13. };
  14. that.setB = function(b) {
  15. _b = b;
  16. };
  17. return that;   //返回单例
  18. })();

以上这种方法,实现了单例的私有变量对用户透明,用户所能知道的只有公开的接口,不能随意改变私有变量,但是这种方法还是在执行脚步的时候就产生了一个单例,用户有可能根本就不使用这段代码,这样就会造成内存浪费,更好的做法是将类的实例化推迟到需要的时候再实例化;

3、lazy方式的单例模式:

[javascript] view plain copy

 
  1. var singleton = (function() {
  2. var _a, _b; //私有变量
  3. var Class = function() {
  4. //code
  5. };
  6. var that = {};
  7. //公开接口
  8. that.getA = function() {
  9. return _a;
  10. };
  11. that.setA = function(a) {
  12. _a = a;
  13. };
  14. that.getB = function() {
  15. return _b;
  16. };
  17. that.setB = function(b) {
  18. _b = b;
  19. };
  20. var _instance = null;
  21. var getInstance = function() {
  22. if(!_instance) {
  23. _instance = new Class();
  24. }
  25. return _instance;
  26. };
  27. Class.prototype = that;
  28. return {
  29. getInstance: getInstance
  30. };
  31. })();

那么这种方法就可以在确实需要这段代码的时候,才实例化,实现懒惰性的单例模式!

js设计模式-单例模式的更多相关文章

  1. JS设计模式——单例模式剖析

    转载于原文地址:https://blog.csdn.net/q1056843325/article/details/52933426 举一个通俗的例子,在页面中点击登录按钮,弹出了一个登录浮窗,这个登 ...

  2. [js]js设计模式-单例模式

    单例模式 不同模块之间需要同时开发, // 单例模式: 把描述同一个事物的属性和方法放在同一个内存空间下. // 优点: 分组,防止冲突 // p1 p2也叫做命名空间(模块开发) var p1 = ...

  3. js 设计模式——单例模式

    单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器中的 window 对象等. JavaScript ...

  4. [转]JS设计模式-单例模式(二)

    单例模式是指保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等.在javaScript开发中 ...

  5. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  6. JS设计模式(一)

    刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...

  7. JavaScript设计模式-单例模式、模块模式(转载 学习中。。。。)

    (转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ...

  8. js设计模式总结1

    js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ...

  9. JS实现单例模式的多种方案

    JS实现单例模式的多种方案 今天在复习设计模式中的-创建型模式,发现JS实现单例模式的方案有很多种,稍加总结了一下,列出了如下的6种方式与大家分享 大体上将内容分为了ES5(Function)与ES6 ...

随机推荐

  1. 0814JavaScript简介、基本语法、运算符、转换

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  2. git 命令的使用(一) add commit push pull

    一. commit 和 push 的区别 git作为支持分布式版本管理的工具,它管理的库(repository)分为本地库.远程库.git commit操作的是本地库,git push操作的是远程库. ...

  3. Npoi导出xlsx

    xlsx文件可以超出,excel2003行数限制.必要的dll文件. public void Export() { string filename = Request["searchStri ...

  4. 转-Android联网 — HttpURLConnection和HttpClient选择哪个好?

    http://www.ituring.com.cn/article/199619?utm_source=tuicool 在Android开发中,访问网络我们是选择HttpURLConnection还是 ...

  5. header('Content-type:text/html;charset = utf-8');出现中文乱码

    header('Content-type:text/html;charset = utf-8'); "="两旁不能留空格,必须紧密连写,否则出现乱码;

  6. maven问题

    pom.xml ... </dependencies> <repositories> <repository> <id>sf-nexus</id& ...

  7. java多线程之计算数量

    package Thread.Abort; import java.util.ArrayList; import java.util.List; import java.util.Random; im ...

  8. R中根据匹配原则将一列拆分为几列的方法

    例如我们需要将一下数据的第二列从and处拆分为两列: before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar ...

  9. 一个简单的jsp自定义标签

    学到了一个简单的jsp自定义标签,后面有更多的例子,会更新出来: 例子1: 步骤: 1.编写标签实现类: 继承javax.servlet.jsp.tagext.SimpleTagSupport; 重写 ...

  10. spring mvc中的json整合

    spring mvc整合过程中是有版本兼容的问题.具体的哪个版本的springmvc和哪个个版本的json包冲突我也无从考证了.我用的springmvc版本是3.2.1jaskson的版本是 1.1. ...