我最近熟悉了 Revealing Module Pattern (RMP),并且阅读了很多关于它的文章。
这似乎是一个非常好的模式,我想在一个大项目中开始使用它。在我使用的项目中:Jquery、KO、requireJS、Jquery Mobile、JayData。在我看来,它非常适合 KO ViewModel。
具体来说,我想使用 THIS它的版本。
有一件事我找不到使用这种模式的缺点,是因为没有(我很难相信)吗?
开始使用之前我应该考虑什么?
最佳答案
揭示模块模式 (RMP) 创建的对象在覆盖方面表现不佳。因此,使用 RMP 制作的对象不能很好地用作原型(prototype)。因此,如果您正在使用 RMP 创建将在继承链中使用的对象,那就不要这样做。 这个观点是我自己的观点,与那些 Revealing Prototype Pattern 的支持者相反。
要查看不良的继承行为,请使用以下 url 构建器示例:
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return _urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
暂且不考虑为什么要对没有私有(private)组件的对象使用 RMP 的问题,请注意,如果您使用返回的对象并使用“http://stackoverflow.com”覆盖 urlBase,您会期望 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"
哪个行为正确。
您可以通过使用此作用域来纠正显示模块模式的行为,如下所示
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/
关于javascript - 显示模块模式 (RMP) 的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14050755/