函數(shù)表達(dá)式
// 特權(quán) / 共有方法和屬性
return {
publicProperty:function(){
publicMenthod : function(){
privateVariable++;
return privateFunction();
}
};
}();
這個(gè)模塊模式使用了一個(gè)返回對象的匿名函數(shù)。在這個(gè)匿名函數(shù)內(nèi)部,首先定義了私有變量和函數(shù)裂允。然后,將一個(gè)對象字面量作為函數(shù)的值返回哥艇。返回的對象字面量中只包含可以公開的屬性和方法绝编。由于這個(gè)對象是在匿名函數(shù)內(nèi)部定義的,因此它的公有方法有權(quán)訪問私有變量和函數(shù)貌踏。從本質(zhì)上來講十饥,這個(gè)對象字面量定義的是單例的公共接口。這種模式在需要對單例進(jìn)行某些初始化祖乳,同時(shí)又需要維護(hù)其私有變量時(shí)是非常有用的逗堵,例如:
var application = function(){
//私有變量和函數(shù)
var components = new Array();
//初始化
components.push(new baseComponent());
// 公共
return {
getComponentCount : function(){
return components.length;
},
registerComponent : function(component) {
if (typeof component == "object"){
components.push(component);
}
}
};
}();
在web應(yīng)用程序中眷昆,經(jīng)常需要使用一個(gè)單例來管理應(yīng)用程序級的信息蜒秤。這個(gè)簡單的例子創(chuàng)建了一個(gè)用于管理組件的appliaction對象。在創(chuàng)建這個(gè)對象的過程中亚斋,首先聲明了一個(gè)私有的components數(shù)組作媚,并向數(shù)組中添加了一個(gè)BasecOMponent的新實(shí)例(在這里不需要關(guān)心BaseComponent的代碼,我們只是用它來展示初始化操作)伞访。而返回對象的getComponentCount()和registerComponent()方法掂骏,都是有權(quán)訪問數(shù)組components的特權(quán)方法轰驳。前者只是返回已注冊的組件數(shù)目厚掷,后者用于注冊新組件。
簡言之级解,如果必須創(chuàng)建一個(gè)對象并以某些數(shù)據(jù)對其進(jìn)行初始化冒黑,同時(shí)還要公開一些能夠訪問這些私有數(shù)據(jù)的方法,那么就可以使用模塊模式勤哗。以這種模式創(chuàng)建的每個(gè)單例都是Object的實(shí)例抡爹,因?yàn)樽罱K要通過一個(gè)對象字面量來表示它。事實(shí)上芒划,這也沒有什么冬竟;畢竟,單例通常都是作為全局對象存在的民逼,我們不會(huì)將它傳遞給一個(gè)函數(shù)泵殴。因此,也就沒有什么必要使用instanceof操作符來檢查其對象類型了拼苍。