##什么是单体
单体是一个用来划分命名空间并将一批相关的方法和属性组织在一起的对象,如果可以被实例化,那么它只能被实例化一次.

##与字面常量的区别
创建方法一样,但是用途不同.字面量用来创建对象,可以用来被继承等等 , 单体用来划分命名空间.

##有什么优势和可用来干什么?
它们可以用来减少网页中的全局变量的数目.它们还可以一种名为分支(branching)的技术中用来封装浏览器之间的差异.更重要的是,借助于单体模式,可以把代码组织得更为一致,从而使其更容易阅读和维护.

##怎么创建单体
创建方法与访问方法和创建字面量一样.

var MyNamespace = {}; //创建一个空的命名空间

//添加成员

MyNamespace.str = "字符串";

MyNamespace.msg = function( val ){

      return val;

}

###怎么在单体模式中创建私有方法

采用闭包来创建私有方法

MyNamespace.singleton = function(){

//私有成员:只能在内部调用,无法被外部访问

var att = 2;

function privateMethod(){

return '私有函数';

}

//公有成员

return {

publicMethod : function(){

     return privateMethod();

},

publicMethod1 : function(){

     return att;

}           

}

}();

//通过命名空间调用内部成员

MyNamespace.singleton.publicMethod();

##惰性加载
单体对象都是在脚本加载时被创建出来.对于资源密集型的域配置开销大的单体,也许更合理的做法是将其实例化推迟到需要使用它的时候.这种技术被称为惰性加载.个人理解:所谓的惰性加载就是把他包含在函数中,当你使用时就去调用它然后才实例化对象.因为没有实例化的对象是不占内存空间的.

//例子 把MyNamespace.singleton转换成惰性加载

1:先判断该类是否被实例化过 

2:如果实例化过,那么它需要知道实例化对象 , 以便返回这个实例.

MyNamespace.singleton = (function(){

var instance;  //来用判断对象是否被实例化,并保存引用

function constructor(){

    //私有成员:只能在内部调用,无法被外部访问

    var att = 2;

    function privateMethod(){

        return '私有函数';

    }

    //公有成员

    return {

        publicMethod : function(){

            return privateMethod();

        },

        publicMethod1 : function(){

            return att;

        }        }

}

return {

    getInstance : function(){

        if( !instance ){

            instance = constructor();

        }

        return instance;

    }    }

})();

//通过命名空间访问对象成员

MyNamespace.singleton.getInstance().publicMethod();