# 暴露模塊模式
既然我們對模塊模式已經有一些了解了,讓我們看一下改進版本 - Christian Heilmann 的啟發式模塊模式。 啟發式模塊模式來自于,當Heilmann對這樣一個現狀的不滿,即當我們想要在一個公有方法中調用另外一個公有方法,或者訪問公有變量的時候,我們不得不重復主對象的名稱。他也不喜歡模塊模式中,當想要將某個成員變成公共成員時,修改文字標記的做法。
因此他工作的結果就是一個更新的模式,在這個模式中,我們可以簡單地在私有域中定義我們所有的函數和變量,并且返回一個匿名對象,這個對象包含有一些指針,這些指針指向我們想要暴露出來的私有成員,使這些私有成員公有化。
下面給出一個如何使用暴露式模塊模式的例子:
~~~
var myRevealingModule = function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
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();
~~~
### 優勢
這個模式是我們腳本的語法更加一致。同樣在模塊的最后關于那些函數和變量可以被公共訪問也變得更加清晰,增強了可讀性。
### 缺點
這個模式的一個缺點是如果私有函數需要使用公有函數,那么這個公有函數在需要打補丁的時候就不能被重載。因為私有函數仍然使用的是私有的實現,并且這個模式不能用于公有成員,只用于函數。
公有成員使用私有成員也遵循上面不能打補丁的規則。
因為上面的原因,使用暴露式模塊模式創建的模塊相對于原始的模塊模式更容易出問題,因此在使用的時候需要小心。
- 前言
- 簡介
- 什么是設計模式?
- 設計模式的結構
- 編寫設計模式
- 反模式
- 設計模式的分類
- 設計模式分類概覽表
- JavaScript 設計模式
- 構造器模式
- 模塊化模式
- 暴露模塊模式
- 單例模式
- 觀察者模式
- 中介者模式
- 原型模式
- 命令模式
- 外觀模式
- 工廠模式
- Mixin 模式
- 裝飾模式
- 亨元(Flyweight)模式
- JavaScript MV* 模式
- MVC 模式
- MVP 模式
- MVVM 模式
- 最新的模塊化 JavaScript 設計模式
- AMD
- CommonJS
- ES Harmony
- JQuery 中的設計模式
- 組合模式
- 適配器模式
- 外觀模式
- 觀察者模式
- 迭代器模式
- 惰性初始模式
- 代理模式
- 建造者模式
- jQuery 插件的設計模式
- JavaScript 命名空間模式
- 總結
- 參考