js 设计模式 第五章 单例模式

单例模式


why?

1 解决global variables 过多的问题。你懂的。__.dom,__.event,这里__就是个单例对象,所有的dom及event都放在__里面,不用再放在global域

how?

将用到的属性和方法都放在一个单例里面,这样,这些属性和方法将不会污染全局空间

what?

最简单的单例模式

var __ ={
    version:'1.0',
    author:'xiongge',
    addEvent:function(){

    }
};

这个例子中,所有的成员都是通过__来访问的。

单例生成了一个名字空间,所有你的属性和方法都放在里面,这样就有效减少了同别的js代码冲突。名字空间,有利于保护自己的属性和方法,避免其他的属性和方法覆盖了名字空间里面的属性。

传统类型的单例有两部分:1 拥有属性和方法的对象本身 2 用来访问这个对象的变量,这个变量往往是global域的,这样单例才能在页面的任何区域都能被访问。


利用闭包,可以产生拥有私有属性的单例

var DataParser = (function(){
//private attributes
var whitespaceRegex = /\s+/;
//private methods
function stripWhitespace(str){
    return str.replace(whitespaceRegex,'');
}
return {
    //public method
    stringToArray : function(str){
        str = stripWhitespace(str);
        return str.split('');
    }
}
})();

上面讲的单例,都是页面加载的时候都运行了。也就是不是按需加载的。

lazy Instantiation

var DataParser = (function(){
    var uniqueInstance;
    function Constructor(){
         //private attributes
         var whitespaceRegex = /\s+/;
         //private methods
         function stripWhitespace(str){
            return str.replace(whitespaceRegex,'');
         }
         return {
          //public method
          stringToArray : function(str){
               str = stripWhitespace(str);
               return str.split('');
          }
        }
    }
    return {
        getInstance: function(){
            if(!uniqueInstance){
                uniqueInstance = constructor();
            }
             return uniqueInstance;
        }
    }
})();


把前面一个代码简单包装下,就出来了。

第一步:讲前面例子的代码放到Constructor函数中。

第二步:让匿名函数返回getInstance方法,在里面实现lazy instantiation



单例作为名字空间的作用,应该多使用。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值