4

一部の既存の Dojo ベースのアプリで、次の形式のシングルトン パターンを使用するモジュールが表示されます。

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

しかし、AMD を正しく理解していれば、define(...) 呼び出しに渡される関数は 1 回だけ実行する必要があるため、_instance の使用は必要ありません。

AMDローダーについての私の理解では、「require」または「define」を呼び出してモジュールを取得すると、モジュールが既にロードされているかどうかがチェックされます。まだ読み込まれていない場合は、JS を読み込み、「define」に渡された関数を実行し、戻り値を内部に保存します。すでにロードされている場合は、以前に保存された値を返すだけです。

私の仮定は正しいですか?その場合、モジュールを作成するときに、特定のモジュールが 1 回だけ読み込まれて実行されると安全に想定できます。また、何かが既に初期化されているかどうかを確認するためのチェックを実行する必要がなく、コードが単純になります。

ありがとうございました。

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 に答える