JavaScript:了解基于模块的单例模式

时间:2016-03-26 19:44:00

标签: javascript module requirejs singleton

感谢this awesome answer我能够将类似单身模式的内容放入我的JavaScript应用程序(单页)中。不幸的是,我仍然有理解这实际上是如何工作的问题。这可能与我没有真正理解require()电话如何实际起作用有关。

引用链接的答案:

  

模块的第一个要求将加载并导出它。需要你的单身人士的其他一些模块将只重用已经导出的模块。

(仍然引用)

define(function (require) {
    var singleton = function () {
        return {
            ...
        };
    };
    return singleton();
});

所以这个过程如下,只是为了确保我理解它。如果有任何错误,请更正流程说明。

在模块A中,我拉入单例模块。

在该模块中,定义了一个返回对象的函数。模块的返回/导出值是该函数的结果。

现在在模块B中,我还require单例模块,并返回单身人士第一次require时创建的同一对象。

第一个和第二个之间的单例数据存在于何处?

我只是不知道这个对象分享是如何工作的,我总是把require想象成某种"虚拟粘贴",但这似乎是非常错误的。实际发生了什么?

1 个答案:

答案 0 :(得分:0)

您的代码类似于单个静态实例。如果您的代码存在于名为' test'我这样做了:

var myFunc = require('./test');

当上面一行运行时,myFunc将是你代码中定义的函数。

但是,在请求之前不会启动真正的单例:

define(function(require){ 
  return (function () {

      // Instance stores a reference to the Singleton
      var instance;

      function init() {

        // Singleton

        // Private methods and variables
        function privateMethod(){
            console.log( "I am private" );
        }

        var privateVariable = "Im also private";

        var privateRandomNumber = Math.random();

        return {

          // Public methods and variables
          publicMethod: function () {
            console.log( "The public can see me!" );
          },

          publicProperty: "I am also public",

          getRandomNumber: function() {
            return privateRandomNumber;
          }

        };

      };

      return {

        // Get the Singleton instance if one exists
        // or create one if it doesn't
        getInstance: function () {

          if ( !instance ) {
            instance = init();
          }

          return instance;
        }

      };

    })();
}

退房:https://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript

相关问题