15

私は、JavaScriptのすべてをnamespace次の行に沿った構造内に配置するサイトに頻繁に遭遇しました。

namespaces = { com : { example: { example.com's data} }

ただし、他の名前空間フレームワークに関してこれを安全に設定するには、比較的大量のコード(2行以上として定義)が必要になるようです。誰かがこれを行うための簡潔な方法を知っているかどうか疑問に思いましたか?さらに、それを構造化するための比較的標準的で一貫した方法があるかどうか?たとえば、com名前空間はグローバルオブジェクトに直接接続されていますか、それとも名前空間オブジェクトを介して接続されていますか?

[編集:おっと、{com = { ... } }それを指摘してくれたShog9のおかげで、明らかに私が意図したものに近いことは何も達成できませんでした。]

4

8 に答える 8

19

Javascriptにはスタンドアロンの名前空間がありません。名前を解決するためのスコープを提供できる関数と、特定のスコープでアクセス可能な名前付きデータに貢献できるオブジェクトがあります。

これがあなたの例です、修正されました:

var namespaces = { com: { example: { /* example.com's data */ } } }

namespacesこれは、オブジェクトリテラルが割り当てられている変数です。オブジェクトには1つのプロパティが含まれています:com、1つのプロパティを持つオブジェクト:example、おそらく何か面白いものが含まれているオブジェクト。

したがって、namespaces.com.exampleのようなものを入力できます。somePropertyOrFunctionOnExampleとそれはすべて動作します。もちろん、それもばかげています。階層的な名前空間はありません。実際に気になるものを含むオブジェクトを含むオブジェクトを含むオブジェクトがあります。

var com_example_data = { /* example.com's data */ };

これは、無意味な階層がなくても同様に機能します。

さて、実際に階層を構築したい場合は、次のようなことを試すことができます。

com_example = com_example || {};
com_example.flags = com_example.flags || { active: false, restricted: true};

com_example.ops = com_example.ops || (function()
    {
       var launchCodes = "38925491753824"; // hidden / private
       return {
         activate: function() { /* ... */ },
         destroyTheWorld: function() { /* ... */ }
       };
    })();

...これは、私見ですが、かなり簡潔です。

于 2008-08-16T16:04:18.260 に答える
12

これは、 Javascript Namespacingに関する Peter Michaux による興味深い記事です。彼は、3 種類の Javascript 名前空間について説明しています。

  1. 接頭辞の名前空間
  2. 単一オブジェクトの名前空間
  3. ネストされたオブジェクトの名前空間

ここで彼が言ったことを盗用するつもりはありませんが、彼の記事は非常に有益だと思います.

Peter は、それらのいくつかにはパフォーマンス上の考慮事項があることを指摘するところまで行きました。ECMAScript Harmony の新しい計画ではネームスペースとパッケージングの 4.0 計画が廃止されたことを考えると、このトピックについて話すのは興味深いと思います。

于 2008-08-17T05:31:35.683 に答える
6

私は、単一の親オブジェクトをグローバル スコープで作成してすべてを含めるという Yahoo の慣例に従おうとしています。

var FP = {};
FP.module = {};
FP.module.property = 'foo';
于 2008-08-17T10:46:13.347 に答える
5

既存のオブジェクトを上書きしないようにするには、次のようにする必要があります。

if(!window.NameSpace) {
    NameSpace = {};
}

また

var NameSpace = window.NameSpace || {};

このようにして、名前空間オブジェクトの上書きを心配することなく、アプリケーション/Web サイトのすべてのファイルの先頭にこれを配置できます。また、これにより、各ファイルの単体テストを個別に作成できます。

于 2008-08-18T14:55:22.313 に答える
3

YUIライブラリライブラリには、望ましいと思われる関数を使用して名前空間を処理するコードがあります。他のライブラリもこれを行う場合があります。

于 2008-08-16T16:06:03.860 に答える
1

ドットまたはアンダースコアの代わりに、ドル記号を使用できます。

var namespaces$com$example = "data"; 
于 2008-08-18T01:38:36.340 に答える
1

私もこれが好きです(source):

(function() {
    var a = 'Invisible outside of anonymous function';
    function invisibleOutside() {
    }

    function visibleOutside() {
    }
    window.visibleOutside = visibleOutside;

    var html = '--INSIDE Anonymous--';
    html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside;
    html += '<br/> typeof visibleOutside: ' + typeof visibleOutside;
    contentDiv.innerHTML = html + '<br/><br/>';
})();

var html = '--OUTSIDE Anonymous--';
html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside;
html += '<br/> typeof visibleOutside: ' + typeof visibleOutside;
contentDiv.innerHTML += html + '<br/>';​
于 2009-06-18T21:16:12.787 に答える
0

オブジェクトリテラルとthisオブジェクトまたは明示的な名前のいずれかを使用して、関数を含むローカル変数の兄弟プロパティに基づいて名前空間を作成します。例えば:

var foo = { bar: function(){return this.name; }, name: "rodimus" }
var baz = { bar: function(){return this.name; }, name: "optimus" }

console.log(foo.bar());
console.log(baz.bar());

または明示的なnameプロパティなし:

var foo = { bar: function rodimus(){return this; } }
var baz = { bar: function optimus(){return this; } }

console.log(foo.bar.name);
console.log(baz.bar.name);

または使用せずにthis

var foo = { bar: function rodimus(){return rodimus; } }
var baz = { bar: function optimus(){return optimus; } }

console.log(foo.bar.name);
console.log(baz.bar.name);

RegExpまたはコンストラクター関数を使用して、Objectカウンター変数およびその他の一般名に名前プロパティを追加してから、hasOwnPropertyテストを使用してチェックを実行します。

 var foo = RegExp(/bar/);
 
/* Add property */
foo.name = "alpha";

document.body.innerHTML = String("<pre>" + ["name", "value", "namespace"] + "</pre>").replace(/,/g, "&#09;");

/* Check type */
if (foo.hasOwnProperty("name")) 
  {
  document.body.innerHTML += String("<pre>" + ["foo", String(foo.exec(foo)), foo.name] + "</pre>").replace(/,/g, "&#09;");
  }

/* Fallback to atomic value */
else 
  {
  foo = "baz";
  }

var counter = Object(1);

/* Add property */
counter.name = "beta";

if (counter.hasOwnProperty("name")) 
  {
  document.body.innerHTML += String("<pre>" + ["counter", Number(counter), counter.name] + "</pre>").replace(/,/g, "&#09;");
  } 
else 
  {
  /* Fallback to atomic value */
  counter = 0;
  }

DOMは、次の規則を使用して、HTMLおよびSVG要素のインターフェイス定義に名前空間を付けます。

  • HTMLTitleElement
  • SVGTitleElement
  • SVGScriptElement
  • HTMLScriptElement

JavaScriptコアは、プロトタイプを使用して、toStringメソッドをポリモーフィズムの単純な形式として名前空間化します。

参考文献

于 2012-03-23T23:25:16.507 に答える