单体模式:用来划分命名空间而组织一些方法和属性的对象,如果它能被实例化,只能被实例化一次;但对象不是单体
var Singleton={
attr1:true;
attr2:2,
method1:function(){
...
},
method2:function(){
...
}
};
var GiantCorp={};
GiantCorp.Common={
...
};
GiantCorp.ErrorCodes={
...
};
GiantCorp.PageHandler={
...
};
单体模式中使用闭包(又称为模块模式)
MyNamespace.Singleton=(function(){
var privateAttribute1=false;
var privateAttribute2=[1,2,3];
function privateMethod1(){
...
};
function privateMethod2(args){
...
};
return{
publicAttribute1=true,
publicAttribute2=10,
publicMethod1=function(){
...
},
publicMethod2=function(){
...
}
};
})();
惰性实例化(将实例化推迟到需要的时候)
MyNamespace.Singleton=(function(){
function constructor(){//放到闭包中
var privateAttribute1=false;
var privateAttribute2=[1,2,3];
function privateMethod1(){
...
};
function privateMethod2(args){
...
};
return{
publicAttribute1=true,
publicAttribute2=10,
publicMethod1=function(){
...
},
publicMethod2=function(){
...
}
}
};
return{//公共方法
getInstance:function(){
...
}
}
})();
加上一个开关(若未实例则实例一次,已经实例就返回这个实例)
Mynamespace.Singleton=(function(){
var uniqueInstance;
function constructor(){
...
};
return{
getInstance:function(){
if(!uniqueInstance){
uniqueInstance=constructor();
}
return uniqueInstance;
}
}
})();
//Mynamespace.Singleton.getInstance.publicMethod1();
分支(创建多个对象字面量,根据某种条件赋给那个变量)
MyNamespace.Singleton=(function(){
var objectA={
method1:function(){
...
},
method2:function(){
...
}
};
var objectB={
method1:function(){
...
},
method2:function(){
...
}
};
return (someCondition)?objectA:objectB;
})();