模塊模式

前面的模式是用於爲自定義類型建立私有變量和特權方法的。而道格拉斯所說的模塊模式則是爲單例建立私有變量和特權方法。所謂單例,值得就是隻有一個實例的對象。按照慣例,Javascript是以對象字面量的方式來建立單例對象的。web

var singleton = { name:value, method:function(){ // 這裏是方法的代碼 
 } }

模塊模式經過爲單例添加私有變量和特權方法可以使其獲得加強,其語法形式以下:數組

var singleton = function (){ // 私有變量和私有函數
    var privateVariable = 10; function privateFunction(){ return false; } // 特權/公有方法和屬性
    return { publicProperty:true, publicMethod:function(){ privateVariable++; return privateFunction(); } }; }();

這個模塊模式使用了一個返回對象的匿名函數。在這個匿名函數內部,首先定義了私有變量和函數。而後,將一個對象字面量最爲函數的值返回。返回的對象字面量中只包含能夠公開的屬性和方法。因爲這個對象是在匿名函數內部定義的,所以它的公有方法有權訪問私有變量和函數。從本質上來說,這個對象字面量定義的是單例的公共接口。這種模式在須要對單例進行某些初始化,同時又須要維護其私有變量時時很是有用的,例如:app

var application = function(){ // 私有變量和函數
    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應用程序中,常常須要使用一個單例來管理應用程序級的信息。這個簡單的例子建立了一個用於管理組件的application對象。在建立這個對象的過程當中,首先聲明瞭一個私有的components數組,並向數組中添加了一個BaseComponent的新實例(在這裏不須要關心BaseComponent的代碼,咱們只是用它來展現初始化操做)。而返回對象的getComponentCount()和registerComponent()方法,都是有權訪問數組components的特權方法。前者只是返回已註冊的組件數目,後者用於註冊新組件。函數

簡言之,若是必須建立一個對象並以某些數據對其進行初始化,同時還要公開一些可以訪問這些私有數據的方法,那麼久可使用模塊模式。以這種模式建立的每一個單例都是object的實例,由於最終要經過一個對象字面量來表示他。事實上,這也沒有什麼;畢竟,單例一般都是做爲全局對象存在的,咱們不會將它傳遞給一個函數。所以,也就沒有什麼必要使用instanceof操做符來檢查其對象類型了。spa

相關文章
相關標籤/搜索