Das Aufdeckende Modulmuster (RMP) erzeugt Objekte, die sich nicht in Bezug auf Übersteuerung gut verhalten. Folglich funktionieren Objekte, die mit dem RMP erstellt wurden, nicht gut als Prototypen. Wenn Sie also RMP verwenden, um Objekte zu erstellen, die in einer Vererbungskette verwendet werden sollen, tun Sie das nicht. Diese Sichtweise ist meine eigene, im Gegensatz zu jenen Befürwortern des Enthüllungsprototypmusters.
Um das schlechte Vererbungsverhalten, nehmen Sie das folgende Beispiel einer URL Builder zu sehen:
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return _urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
Abgesehen von der Frage, warum Sie RMP für ein Objekt ohne privaten Komponenten verwenden würden, beachten Sie, dass, wenn Sie nimm das zurückgegebene Objekt und überschreibe urlBase mit "http://stackoverflow.com", du würdest erwarten, dass sich das Verhalten von build() entsprechend ändert. Es ist nicht, wie im folgenden zu sehen:
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"
Kontrast das Verhalten mit der folgenden URL Builder Implementierung
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"
die korrekt verhält.
können Sie korrigieren das Aufdecken Verhalten des Moduls Muster durch diesen Bereich, wie in der
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return this.urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
folgenden verwenden, aber dass Niederlagen eher den Zweck des Revealing Modul-Muster. Weitere Einzelheiten finden Sie in meinem Blog http://ilinkuo.wordpress.com/2013/12/28/defining-return-object-literals-in-javascript/
Überprüfen Sie diesen Artikel: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript gibt es eine Nachteile Abschnitt am Ende. – nemesv
Das Definitive-Modul-Muster überwindet auch einige Nachteile des Modulmusters und des Enthüllungsmusters (z. B. enge Kopplung mit der return-Anweisung, wie öffentliche und private Funktionen deklariert werden, nicht deklarative Namespaces für private und öffentliche Subroutinen und gemischte Verwendung eines Objekts) Literal mit der return-Anweisung): http://github.com/tfmontague/definitive-module-pattern – tfmontague