揭示模块模式的缺点(Revealing module pattern disadvantages)

2019-07-17 15:06发布

我最近买了熟悉显露的模块模式,我已经读到它有好几篇文章。

这似乎是一个很好的模式,我想开始在一个大的项目,我有使用它。 在项目中,我使用:jQuery的,KO,requirejs,jQuery Mobile的,JayData。 在我看来,像这将是一个非常适合的KO的ViewModels。

在具体的我想使用这版吧。

有一件事我无法找到是使用这种模式的缺点,是不是因为没有任何(我很难相信)?

我应该在开始使用前,应考虑什么?

Answer 1:

所述显示模块模式(RMP)创建不相对于重写表现良好对象。 因此,使用RMP制造的物品不和原型工作。 所以,如果你正在使用RMP创建要在继承链中使用的对象,只是没有。 这个观点是我自己,在反对显露的原型模式的那些支持者。

要看到坏的继承行为,采取了网址构建器的下面的例子:

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 ”,你会期望构建的)行为(以适当改变。 这不,如下面所示:

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"

相比之下,行为与以下网址构建器实现

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/



Answer 2:

我读了@nemesv引用我(谢谢:))的文章,我认为有是没有提到一个更加不利的,所以我想我会在这里添加它以供参考。 下面是文章报价:

缺点

这种模式的缺点是,如果一个私有函数是指一个公共职能,公共功能无法修补程序是否需要重写。 这是因为私有函数将继续指私有实现和模式并不适用于公共成员,只有功能。

公共对象成员这是指私有变量也受到上述无补丁的规则说明。

作为其结果,与所述显示模块模式创建模块可以比那些与原来的模块图案创建更脆弱,所以应该小心使用期间服用。

而我除了:

你不能使用继承这种模式 。 例如:

var Obj = function(){
    //do some constructor stuff
}

var InheritingObj = function(){
    //do some constructor stuff
}

InheritingObj.prototype = new Obj();

InheritingObj.prototype.constructor = InheritingObj;

这对于JS继承一个简单的例子,但使用时显露的原型模式 ,你需要做到这一点:

InheritingObj.prototype = (function(){
    //some prototype stuff here
}());

这将覆盖你继承。



Answer 3:

与所述显示模块模式的其他缺点包括:

  1. 与Return语句的公共职能紧密结合
  2. 对象的混合使用字面公共职能和独立宣言的私人活动

我建议你使用过透出模块模式明确的模块模式( https://github.com/tfmontague/definitive-module-pattern )



文章来源: Revealing module pattern disadvantages