Il Revealing Module Pattern (RMP) crea oggetti che non si comportano bene rispetto alla sovrascrittura. Di conseguenza, gli oggetti creati usando il RMP non funzionano bene come prototipi. Quindi se stai usando RMP per creare oggetti che verranno utilizzati in una catena ereditaria, non farlo. Questo punto di vista è il mio, in opposizione a coloro che propongono il modello del prototipo rivelatore.
Per vedere il comportamento eredità male, prendere il seguente esempio di un costruttore URL:
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return _urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
Mettendo da parte la questione del perché si usa RMP per un oggetto senza componenti private, si noti che se si prendere l'oggetto restituito e sovrascrivere urlBase con "http://stackoverflow.com", ci si aspetterebbe che il comportamento di build() cambi in modo appropriato. E non lo fa, come si vede nella seguente:
var builder = new rmpUrlBuilder();
builder.urlBase = "http://stackoverflow.com";
console.log(builder.build("/questions"); // prints "http://my.default.domain/questions" not "http://stackoverflow.com/questions"
Contrasto il comportamento con il seguente URL implementazione costruttore
function urlBuilder = function(){
return {
urlBase: "http://my.default.domain/".
build: function(relUrl){ return this.urlBase + relUrl;}
}
}
var builder = new urlBuilder();
builder.urlBase = "http://stackoverflow.com";
console.log(builder.build()); // prints "http://stackoverflow.com/questions"
che si comporta in modo corretto.
È possibile correggere il comportamento del modulo del modello rivelante utilizzando questo ambito come il seguente
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return this.urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
ma piuttosto vanifica il senso del pattern modulo rivelatore. Per maggiori dettagli, vedere il mio post sul blog http://ilinkuo.wordpress.com/2013/12/28/defining-return-object-literals-in-javascript/
Controlla questo articolo: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript c'è una sezione sugli svantaggi alla fine. – nemesv
Il modello di modulo definitivo supera anche alcuni svantaggi con il modello del modulo e il pattern rivelatore (come l'accoppiamento stretto con l'istruzione return, le funzioni pubbliche e private dichiarate, gli spazi dei nomi non dichiarativi per le subroutine private e pubbliche e l'uso misto di un oggetto letterale con la dichiarazione di ritorno): http://github.com/tfmontague/definitive-module-pattern – tfmontague