czytałem ten link http://addyosmani.com/largescalejavascript/#modpatternenkapsulacji w javascript moduł wzór
I zobaczyłem następujący przykład.
var basketModule = (function() {
var basket = []; //private
return { //exposed to public
addItem: function(values) {
basket.push(values);
},
getItemCount: function() {
return basket.length;
},
getTotal: function(){
var q = this.getItemCount(),p=0;
while(q--){
p+= basket[q].price;
}
return p;
}
}
}());
basketModule.addItem({item:'bread',price:0.5});
basketModule.addItem({item:'butter',price:0.3});
console.log(basketModule.getItemCount());
console.log(basketModule.getTotal());
Statystyki To, że „wzorzec moduł to popularna konstrukcja że wzór, który obudowuje«prywatność», państwa i organizacji za pomocą zamknięć” Jak się to różni od pisania go jak poniżej? Czy prywatność nie może być po prostu egzekwowana za pomocą zakresu funkcji?
var basketModule = function() {
var basket = []; //private
this.addItem = function(values) {
basket.push(values);
}
this.getItemCount = function() {
return basket.length;
}
this.getTotal = function(){
var q = this.getItemCount(),p=0;
while(q--){
p+= basket[q].price;
}
return p;
}
}
var basket = new basketModule();
basket.addItem({item:'bread',price:0.5});
basket.addItem({item:'butter',price:0.3});
Chyba moje pytanie jest teraz to pierwszy wzór bardziej „moduł” niż sekundę. Łącze wykorzystuje pierwszy wariant jako wyraźny przykład wzorca modułu. – eirikrl
Powiedziałbym, że pierwszy wariant odzwierciedla wzór modułu (dostarczając 'basketModule'), drugi zapewnia sposób tworzenia instancji' basket' *. To wszystko kwestia etykietowania po drodze, możesz nazwać pierwszy wariant także "wzorem singleton". – KooiInc
Z punktu widzenia, że moduł jest odizolowanym pakietem funkcjonalności, a nie zestawem klas natychmiastowych, to tak. Jednak różnica między nimi nie polega na tyle, by projektować, ale na składni. Nic nie stoi na przeszkodzie, aby singleton był drugi, mając 'var basketModule = new function() {...};'. Pomysł użycia obiektu zwracającego polega na tym, że możesz skondensować interfejs na kilka linii kodu, jeśli wolisz, abyś mógł go zobaczyć na pierwszy rzut oka. Ale nie używałbyś do tego dużych anonimowych funkcji, wystarczyłoby 'return {publicFunc: privateFunc};'. –