注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

前端开发那点事儿

冒犯之处,敬请谅解。

 
 
 

日志

 
 
 
 

js设计模式——单例/单体模式  

2014-08-22 10:27:13|  分类: JS高级 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

1、最常见的单例模式:

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


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

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

[javascript]

var singleton = (function() {
      var _a, _b;    //私有变量
 
     var that = {}; //new某个类
 
     //公开接口
     that.getA = function() {
          return _a;
    };
    that.setA = function(a) {
         _a = a;
    };
 
    that.getB = function() {
         return _b;
    };
    that.setB = function(b) {
         _b = b;
 
    };
 
    return that;   //返回单例
})();


 

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

3、lazy方式的单例模式:

[javascript]

var singleton = (function() {
      var _a, _b; //私有变量   
      var Class = function() {
           //code
      };
     var that = {};
    //公开接口
     that.getA = function() {
         return _a;
    };
    that.setA = function(a) {
        _a = a;
    };
    that.getB = function() {
        return _b;
    };
    that.setB = function(b) {
       _b = b;
    };
    var _instance = null;
    var getInstance = function() {
          if(!_instance) {
                 _instance = new Class();
           }  
           return _instance;
    };
     Class.prototype = that;
    return {
          getInstance: getInstance
   };
})();


 

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

  评论这张
 
阅读(436)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017