2014-03-31 41 views
1

b/w以下兩種模式有什麼不同嗎?自執行第一個程序的優點是什麼?Javascript - Module Pattern differences

var testModule = (function() { 
    var counter = 0; 

    return { 
    incrementCounter: function() { 
     return counter++; 
    }, 

    resetCounter: function() { 
     console.log("counter value prior to reset: " + counter); 
     counter = 0; 
    } 
    }; 
})(); 

testModule.incrementCounter(); // 1 

下一頁:

var testModule2 = function() { 
    var counter = 0; 

    return { 
    incrementCounter: function() { 
     return counter++; 
    }, 

    resetCounter: function() { 
     console.log("counter value prior to reset: " + counter); 
     counter = 0; 
    } 
    } 
} 

var result = testModule2(); 
result.incrementCounter(); //1 
+2

最明顯的區別是第一個可以只創建一個對象,而第二個可以創建多個。你在尋找什麼以外的東西? –

+0

啊,我明白了。我沒有注意到這一點。所以第一個只允許一個對象,第二個可以包含多個? – KingKongFrog

+1

那麼,當你保留一個函數的引用時,你可以根據需要多次調用它。如果你沒有引用,而只是立即調用它,它只有一次有用。這與模塊模式無關。這只是簡單的邏輯。你不能調用你不能引用的函數。 –

回答

4

第一種是單 - 你可以克隆它,當然,但它會很尷尬,第一次,也不會作出這樣的私人副本變量:所有克隆對象的所有方法仍然可以使用相同的var counter。這就是爲什麼它適合製作類似服務的東西。

第二個是實際構造函數的變體 - 它適用於基於單個模板創建多個事物。它的缺點(與經典的基於prototype的模板相比)是,每次調用testModule2時,其中定義的所有函數都會重新創建。它的優點 - 私有變量,爲每個新對象創建一個獨立的集合(注意克隆用第一種方法創建的對象的區別)。