The Revealing Module Pattern(顯示模塊模式)
現(xiàn)在我們已經(jīng)對(duì)模塊模式有了更進(jìn)一步的了解,讓我們?cè)賮?lái)看一個(gè)輕微的改進(jìn)版 - Christian Heilmann的顯示模塊模式缺虐。
顯示模塊的出現(xiàn)是由于Heilmann對(duì)于一個(gè)事實(shí)非常沮喪葵硕,當(dāng)他從另一個(gè)方法調(diào)用一個(gè)公有方法或者訪問(wèn)公有變量時(shí)巷折,必須要重復(fù)主對(duì)象的名稱俯萌。而且使用Module時(shí)必須要切換到對(duì)象字面量表示法來(lái)讓某種方法變成公有方法钥屈。
他努力的結(jié)果就是更新了模式涛贯,我們可以在私有的作用域內(nèi)簡(jiǎn)單的定義所有的方法和變量,并且返回一個(gè)匿名的對(duì)象指向我們希望公開(kāi)的私有方法侠姑。
案例如下:
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// 顯示的公有對(duì)象指向私有的方法和屬性
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
如果我們?cè)敢獾脑捬艟啵@種模式也可以用一個(gè)更具體的方案來(lái)顯示私有函數(shù)和屬性。
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();
優(yōu)點(diǎn)
這種模式可以讓我們腳本的語(yǔ)法變得更加一致结借,它也讓模塊的結(jié)尾更加的清晰。我們的方法和變量可公開(kāi)訪問(wèn)卒茬,從而簡(jiǎn)化可讀性船老。
缺點(diǎn)
如果一個(gè)私有方法引用了一個(gè)公有的方法,如果補(bǔ)丁是必要的則公有方法是不可以被重寫的圃酵。這是因?yàn)樗接蟹椒▽⒗^續(xù)引用私有的實(shí)現(xiàn)并且模式不應(yīng)該應(yīng)用于私有成員柳畔,只適用于私有函數(shù)。
引用私有變量的公有對(duì)象成員也服從上面的無(wú)補(bǔ)丁規(guī)則郭赐。
因此薪韩,用顯示模塊模式創(chuàng)建的模塊,可能比用傳統(tǒng)的模塊模式創(chuàng)建的模塊更脆弱捌锭,所以在使用過(guò)程中應(yīng)多加小心俘陷。