【问题标题】:JavaScript: Understanding module based singleton patternJavaScript:理解基于模块的单例模式
【发布时间】:2016-03-26 19:44:00
【问题描述】:

感谢this awesome answer,我能够将单例模式之类的东西放入我的 JavaScript 应用程序(单页)中。不幸的是,我仍然无法理解这实际上是如何工作的。这可能与我没有真正了解require() 调用的具体工作原理有关。

引用链接的答案:

模块的第一个要求将加载和导出它。其他一些需要你的单例的模块只会重用已经导出的模块。

(仍在引用)

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

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

在模块A 中,我引入了单例模块。

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

现在在模块 B 中,我还 require 单例模块并取回单例第一次创建时创建的对象 required。

单例数据在第一个需求和第二个需求之间位于何处?

我只是不明白这个对象共享是如何工作的,我一直认为require 是某种“虚拟粘贴”,但这似乎是非常错误的。实际发生了什么?

【问题讨论】:

    标签: javascript module requirejs singleton


    【解决方案1】:

    您的代码更像是一个静态实例,而不是一个单例。如果您的代码位于一个名为“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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2012-01-04
      • 1970-01-01
      • 2013-07-20
      相关资源
      最近更新 更多