Components.utils.import
出典: MDC
この記事は Firefox 3 の新機能について述べています
このメソッドは Firefox 3 で導入され、異なるスコープ間でコードを簡単に共有するのに使われます。例えば、自分のコンポーネントの中で、長いコンポーネント登録の定型文をコピーアンドペーストすることを避けるために XPCOMUtils.jsm をインポートすることができます。
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
ドキュメンテーションは、Using_JavaScript_code_modules を参照してください。
[編集] mozIJSSubScriptLoader との違い
mozIJSSubScriptLoader との違い:
- 異なる場所から同じコードをインポート/読み込みした時の挙動
- サブスクリプトローダ (subscript loader) は、特定のコードが実行される度毎に 呼び出し元 (caller) のグローバルオブジェクトで評価します。
Components.utils.importはそれぞれのモジュールのコードを一度だけ、自分自身のスコープの中で評価します
例:
var scope1 = {}, scope2 = {}; Components.utils.import("resource://gre/modules/JSON.jsm", scope1); Components.utils.import("resource://gre/modules/JSON.jsm", scope2); assert(scope2.XPCOMUtils === scope1.XPCOMUtils);...
trueを返します。対して:var someURL = "resource://gre/modules/JSON.jsm"; var obj1 = {}, obj2 = {}; var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"] .getService(Components.interfaces.mozIJSSubScriptLoader); loader.loadSubScript(someURL, obj1) loader.loadSubScript(someURL, obj2) assert(obj2 === obj1);..
falseを返します。これは、異なるスコープで実行している JS 間での効果的なコード (とデータ?) の共有に
Components.utils.importがより適している事を意味しています。 - サブスクリプトローダは読む込むコードの URL を受け付けますが、
importは、resource:とfile:URI しか受け付けません。
[編集] 追加リソース
- bug 238324
- xpccomponents.idl 内のドキュメンテーション
-
js/src/xpconnect/tests/unit/内のテスト