Revealing Module Pattern (RMP) は、オーバーライドに関して適切に動作しないオブジェクトを作成します。結果として、RMP を使用して作成されたオブジェクトは、プロトタイプとしてうまく機能しません。したがって、RMP を使用して継承チェーンで使用されるオブジェクトを作成している場合は、そうしないでください。この観点は私自身のものであり、Revealing Prototype パターンの支持者とは対照的です。
不適切な継承動作を確認するには、次の URL ビルダーの例を見てください。
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return _urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
なぜプライベート コンポーネントのないオブジェクトに RMP を使用するのかという問題はさておき、返されたオブジェクトを取得して urlBase を " http://stackoverflow.com " でオーバーライドすると、 build() の動作が適切に変更します。次のように、そうではありません。
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"
次の 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"
これは正しく動作します。
次のようにこのスコープを使用することで、Revealing Module パターンの動作を修正できます。
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return this.urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
しかし、それは明らかにモジュール パターンの目的を無効にします。詳細については、私のブログ投稿http://ilinkuo.wordpress.com/2013/12/28/defining-return-object-literals-in-javascript/を参照してください。