Schemat modułu ujawniającego (RMP) tworzy obiekty, które nie zachowują się dobrze w odniesieniu do przesłonięcia. W konsekwencji obiekty wykonane za pomocą RMP nie działają dobrze jako prototypy. Jeśli więc używasz RMP do tworzenia obiektów, które będą używane w łańcuchu dziedziczenia, po prostu nie rób tego. Ten punkt widzenia jest moim własnym, w przeciwieństwie do tych zwolenników Odkrywczego Wzoru Prototypowego.
Aby zobaczyć złe dziedziczenia zachowań, przyjąć następującą przykład konstruktora URL:
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return _urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
Pomijając kwestię, dlaczego byłoby użyć RMP dla obiektu bez prywatnych składników, trzeba pamiętać, że jeśli odebrać zwrócony obiekt i zastąpić urlBase przez "http://stackoverflow.com", można oczekiwać, że zachowanie funkcji build() odpowiednio się zmieni. To nie jest, jak widać poniżej:
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 zachowanie z realizacją budowniczy następujący adres URL
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"
który zachowuje się poprawnie.
Można poprawić zachowanie ujawniające moduł wzór, używając tego zakresu jak w poniższym
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return this.urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
ale raczej pokonuje cel ujawniając Module Pattern. Aby uzyskać więcej informacji, patrz mój blog zakładać http://ilinkuo.wordpress.com/2013/12/28/defining-return-object-literals-in-javascript/
Sprawdź ten artykuł: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript na końcu znajduje się sekcja wady. – nemesv
Definicyjny wzorzec modułu eliminuje również pewne wady za pomocą wzorca modułu i wzoru ujawniającego (takiego jak ścisłe powiązanie z instrukcją return, jak deklarowane są funkcje publiczne i prywatne, nieprzypisane przestrzenie nazw dla prywatnych i publicznych podprogramów i mieszane użycie obiektu dosłowne z instrukcją zwrotu): http://github.com/tfmontague/definitive-module-pattern – tfmontague