4

在一些现有的基于 Dojo 的应用程序中,我看到一个使用单例模式的模块:

define([...], function(...) {
  var MyClass = declare(...);
  if (!_instance) {
    var _instance = new MyClass();
  }
  return _instance;
});

但是,如果我正确理解 AMD,则不需要使用 _instance,因为传递给 define(...) 调用的函数应该只执行一次......或者可能不?

我对AMD loader的理解是,通过调用“require”或“define”获取模块时,会检查模块是否已经被加载。如果还没有加载,就会加载JS,执行传递给“define”的函数,内部存储返回值。如果它已经被加载,它将简单地返回先前存储的值。

我的假设正确吗?如果是这样,在编写模块时,我们可以放心地假设给定的模块只会被加载和执行一次,并且我们不需要执行任何检查来查看某些内容是否已经初始化,从而使代码更简单。

谢谢你。

4

1 回答 1

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);
});
于 2013-06-13T11:22:18.433 回答