javascript – 揭示模块模式的缺点

前端之家收集整理的这篇文章主要介绍了javascript – 揭示模块模式的缺点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_0@
我最近熟悉了“显示模块”模式,我已经阅读了不少文章.

这似乎是一个非常好的模式,我想开始在一个大项目中使用它.在我使用的项目中: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/

猜你在找的JavaScript相关文章