javascript - 显示模块模式 (RMP) 的缺点

标签 javascript design-patterns knockout.js revealing-module-pattern

我最近熟悉了 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/

相关文章:

javascript - 揭示模块模式问题

c# - 分页作为带有简单注入(inject)器的 cqrs 中的横切关注点

javascript - 如何延迟 KO 结合直到加载外部模板?

javascript - 当鼠标停止移动时执行 Jquery

javascript - 如何在剑道下拉列表中搜索文本?

javascript - 将 REX 与 hasClass 一起使用

android - 谷歌地图中使用的模式名称 > 滚动后的 Activity 变为全屏 Activity

javascript - 如何将 Eloquent 模型传递给 Knockout.js View 模型构造函数?

javascript - 在较大的数据网格上 KO 性能较差

javascript - 宽高比为 16 :9 and 4:3/Vertically centering the canvas when the aspect ratio is 4:3 的 Canvas 是否有任何通用尺寸