在一些现有的基于Dojo的应用程序中,我看到一个模块使用以下形式的单例模式:
define([...], function(...) {
var MyClass = declare(...);
if (!_instance) {
var _instance = new MyClass();
}
return _instance;
});
但如果我正确理解AMD,则不需要使用_instance,因为传递给define(...)调用的函数应该只执行一次......或者可能不执行?
我对AMD加载器的理解是,当通过调用“require”或“define”获取模块时,它将检查模块是否已经加载。如果尚未加载,它将加载JS,执行传递给“define”的函数,并在内部存储返回的值。如果它已被加载,它将只返回先前存储的值。
我的假设是否正确?如果是这样,在编写模块时,我们可以安全地假设给定的模块只会被加载并执行一次,我们不需要执行任何检查以查看是否已经初始化了某些内容,从而使代码更简单。
谢谢。
答案 0 :(得分:3)
你是对的,但不完全是
define("my.widget", [ "dojo/_base/declare",.... ], function(declare, ...){
return declare("my.widget", [ .. ], {
value : "myvalue"
});
});
这里我们定义了定义类的模块,因此当需要模块时,类声明(构造函数)被缓存,这意味着类只定义一次。但这并不意味着你可以将它用作静态,因为那只是类声明,而不是实例。
这不起作用:
require(["my.widget"], function(widget) {
console.log(widget.value);
});
这是正确的用法:
require(["my.widget"], function(widget) {
console.log(new widget().value);
});