The Revealing Module Pattern(顯示模塊模式)
現在我們已經對模塊模式有了更進一步的了解,讓我們再來看一個輕微的改進版 - Christian Heilmann的顯示模塊模式。
顯示模塊的出現是由于Heilmann對于一個事實非常沮喪,當他從另一個方法調用一個公有方法或者訪問公有變量時,必須要重復主對象的名稱。而且使用Module時必須要切換到對象字面量表示法來讓某種方法變成公有方法。
他努力的結果就是更新了模式,我們可以在私有的作用域內簡單的定義所有的方法和變量,并且返回一個匿名的對象指向我們希望公開的私有方法。
案例如下:
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// 顯示的公有對象指向私有的方法和屬性
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
如果我們愿意的話,這種模式也可以用一個更具體的方案來顯示私有函數和屬性。
var myRevealingModule = (function () {
var privateCounter = 0;
function privateFunction() {
privateCounter++;
}
function publicFunction() {
publicIncrement();
}
function publicIncrement() {
privateFunction();
}
function publicGetCount(){
return privateCounter;
}
// Reveal public pointers to
// private functions and properties
return {
start: publicFunction,
increment: publicIncrement,
count: publicGetCount
};
})();
myRevealingModule.start();
優點
這種模式可以讓我們腳本的語法變得更加一致,它也讓模塊的結尾更加的清晰。我們的方法和變量可公開訪問,從而簡化可讀性。
缺點
如果一個私有方法引用了一個公有的方法,如果補丁是必要的則公有方法是不可以被重寫的。這是因為私有方法將繼續引用私有的實現并且模式不應該應用于私有成員,只適用于私有函數。
引用私有變量的公有對象成員也服從上面的無補丁規則。
因此,用顯示模塊模式創建的模塊,可能比用傳統的模塊模式創建的模塊更脆弱,所以在使用過程中應多加小心。