Revealing module pattern disadvantages

前端 未结 3 1352
北荒
北荒 2020-12-05 08:23

I recently got familiar with the Revealing Module pattern and I\'ve read quite a few articles about it.

It seems like a very good pattern and I would like to start u

3条回答
  •  失恋的感觉
    2020-12-05 09:07

    The Revealing Module Pattern (RMP) creates objects that don't behave well with respect to overriding. As a consequence, objects made using the RMP don't work well as prototypes. So if you're using RMP to create objects that are going to be used in an inheritance chain, just don't. This point of view is my own, in opposition to those proponents of the Revealing Prototype Pattern.

    To see the bad inheritance behavior, take the following example of a url builder:

    function rmpUrlBuilder(){
      var _urlBase = "http://my.default.domain/";
      var _build = function(relUrl){
        return _urlBase + relUrl;
      };
    
      return {
        urlBase: _urlBase,
        build: _build
      }
    }
    

    Setting aside the question of why you would use RMP for an object with no private components, note that if you take the returned object and override urlBase with "http://stackoverflow.com", you would expect the behavior of build() to change appropriately. It doesn't, as seen in the following:

    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"
    

    Contrast the behavior with the following url builder implementation

    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"
    

    which behaves correctly.

    You can correct the Revealing Module Pattern's behavior by using this scope as in the following

    function rmpUrlBuilder(){
      var _urlBase = "http://my.default.domain/";
      var _build = function(relUrl){
        return this.urlBase + relUrl;
      };
    
      return {
        urlBase: _urlBase,
        build: _build
      }
    }
    

    but that rather defeats the purpose of the Revealing Module Pattern. For more details, see my blog post http://ilinkuo.wordpress.com/2013/12/28/defining-return-object-literals-in-javascript/

提交回复
热议问题