【问题标题】:Convert the revealing module pattern code into module pattern将显示模块模式代码转换为模块模式
【发布时间】:2014-07-02 05:34:35
【问题描述】:

http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

我正在浏览上面的杰作。我仍然无法从上面的文章中得到两件事。

var myRevealingModule = (function () {

        var privateVar = "Ben Cherry",
            publicVar  = "Hey there!";

        function privateFunction() {
            console.log( "Name:" + privateVar );
        }

        function publicSetName( strName ) {
            privateVar = strName;
        }

        function publicGetName() {
            privateFunction();
        }


        // Reveal public pointers to
        // private functions and properties

        return {
            setName: publicSetName,
            greeting: publicVar,
            getName: publicGetName
        };

    })();

myRevealingModule.setName( "Paul Kinlan" );

相关问题: JavaScript design pattern: difference between module pattern and revealing module pattern?

我从上述问题中理解了很多部分。任何人都可以将上面的revealing module pattern 转换为传统的module pattern,以便我可以看到差异。

【问题讨论】:

  • 据我所知,revealing module pattern 只是module pattern 的另一种方式。如果您想要另一种方法,请查看 node.js 模块 (commonjs) 或 amd 模块。这更像是modules(至少在我看来),因为没有任何明确的闭包。虽然最后基本上是一样的,只是为你生成了一些代码。
  • 另外,关于您在上面发布的代码的一点。 publicVar 不公开,因为 myRevealingModule.greeting 不是指针,如下所示:jsfiddle.net/Xr2kB

标签: javascript oop design-patterns module-pattern revealing-module-pattern


【解决方案1】:

模块模式代码如下:可以看到jsfiddle

var myModule = (function () {

    var privateVar = "Ben Cherry";

    function privateFunction() {
        console.log( "Name:" + privateVar );
    }

    return {
        setName: function( strName ) {
            privateVar = strName;
        },
        greeting: "Hey there!",
        getName: function() {
            privateFunction();
        }
    };

})();
myModule.setName( "Paul Kinlan" );

【讨论】:

    【解决方案2】:

    在避免显示模块模式时,您有两种选择。您可以使用对象字面量或存根返回对象。

    使用对象字面量:

    var myRevealingModule = (function () {
       var privateVar = "Ben Cherry";
    
       function privateFunction() {
          console.log( "Name:" + privateVar );
       }
    
       return {
          setName: function( strName){
             privateVar = strName;
          },
          greeting: "Hey there!",
          getName: function() {
             privateFunction();
          }
       };
    
    })();
    

    使用存根:

    var myRevealingModule = (function () {
       var privateVar = "Ben Cherry";
       function privateFunction() {
           console.log( "Name:" + privateVar );
       }
    
       var stub = {};
       stub.greeting = "Hey there!";
       stub.setName = function ( strName ) {
          privateVar = strName;
       };
       stub.getName = function () {
          privateFunction();
       }
       return stub;
    
    })();
    

    关键是不要在闭包中放入任何东西,除非你打算隐藏它。不要在闭包中放一些东西,然后再“揭示”它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 2020-01-23
      • 2016-05-15
      相关资源
      最近更新 更多