感谢this awesome answer我能够将类似单身模式的内容放入我的JavaScript应用程序(单页)中。不幸的是,我仍然有理解这实际上是如何工作的问题。这可能与我没有真正理解require()
电话如何实际起作用有关。
引用链接的答案:
模块的第一个要求将加载并导出它。需要你的单身人士的其他一些模块将只重用已经导出的模块。
(仍然引用)
define(function (require) {
var singleton = function () {
return {
...
};
};
return singleton();
});
所以这个过程如下,只是为了确保我理解它。如果有任何错误,请更正流程说明。
在模块A
中,我拉入单例模块。
在该模块中,定义了一个返回对象的函数。模块的返回/导出值是该函数的结果。
现在在模块B
中,我还require
单例模块,并返回单身人士第一次require
时创建的同一对象。
第一个和第二个之间的单例数据存在于何处?
我只是不知道这个对象分享是如何工作的,我总是把require
想象成某种"虚拟粘贴",但这似乎是非常错误的。实际发生了什么?
答案 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