我最近熟悉了“显示模块”模式,我已经阅读了不少文章.
这似乎是一个非常好的模式,我想开始在一个大项目中使用它.在我使用的项目中:Jquery,KO,requirejs,Jquery Mobile,JayData.在我看来,它似乎适合KO viewmodels.
具体我想使用THIS版本.
有一件事我找不到使用这种模式的缺点,是因为没有(我觉得很难相信)吗?
在开始使用之前应该考虑什么?
解决方法
显示模块模式(RMP)创建对覆盖行为表现不佳的对象.因此,使用RMP制作的对象不能像原型一样运行.因此,如果您使用RMP来创建将要在继承链中使用的对象,那么请不要.这个观点是我自己的,反对那些揭示原型模式的支持者.
要看到不良的继承行为,请参考以下url构建器示例:
function rmpUrlBuilder(){ var _urlBase = "http://my.default.domain/"; var _build = function(relUrl){ return _urlBase + relUrl; }; return { urlBase: _urlBase,build: _build } }
设置为什么您将RMP用于没有私有组件的对象的问题,请注意,如果您使用返回的对象并覆盖“https://stackoverflow.com”的urlBase,则可以期待build()的行为正确更改.它没有,如下所示:
var builder = new rmpUrlBuilder(); builder.urlBase = "https://stackoverflow.com"; console.log(builder.build("/questions"); // prints "http://my.default.domain/questions" not "https://stackoverflow.com/questions"
将行为与以下网址构建器实现对比
function urlBuilder = function(){ return { urlBase: "http://my.default.domain/". build: function(relUrl){ return this.urlBase + relUrl;} } } var builder = new urlBuilder(); builder.urlBase = "https://stackoverflow.com"; console.log(builder.build()); // prints "https://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/