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. poj 3040 Allowance

    Allowance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1842   Accepted: 763 Descript ...

  2. Hadoop Bloom filter应用示例

    Hadoop0.20.2 Bloom filter应用示例 2014-06-04 11:55 451人阅读 评论(0) 收藏 举报 1. 简介 参见<Hadoop in Action>P1 ...

  3. eclipse升级,导入旧版eclipse的插件[转]

    启动 eclipse.菜单 File => import … => Install => From existing Installation, 点确定, 就会弹出对话框, 浏览选择 ...

  4. 并发工具类(三)控制并发线程数的Semaphore

    原文:http://ifeve.com/concurrency-semaphore/#more-14753 简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程, ...

  5. 30天轻松学习javaweb_http头信息实例

    package com.wzh.test.http; import java.io.ByteArrayOutputStream;import java.io.IOException;import ja ...

  6. NSMutableAttributedString 设置不同颜色,不同字体的String

    UILabel *infoLabel = [[UILabel alloc]initWithFrame:CGRectMake(95, 20, 190, 70)]; infoLabel.backgroun ...

  7. 一步步教你如何把电脑设置U盘启动(图解教程)

    一.我们先来说说如何进入 BIOS设置程序: 在开机时按下特定的热键可以进入BIOS设置程序,不同类型的机器进入BIOS设置程序的按键不同,有的在屏幕上给出提示,有的不给出提示,几种常见的BIOS设置 ...

  8. Singleton 单例模板

    // singleton.h #ifndef SINGLETON_H #define SINGLETON_H // 单例基类模板 template <class T> class Sing ...

  9. [ActionScript 3.0] AS3 时间日期格式化DateTimeFormatter类的运用

    import flash.globalization.DateTimeFormatter; var _timeFormatter:DateTimeFormatter; var _dateFormatt ...

  10. Java实现单向链表的增删改查

    class List<T> { private class Node { private T data; private Node next; private Node(T data) { ...