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() { /* ... */ }
};
})();
...で、私見で、合理的に簡潔な:あなたが実際には、階層を構築したい場合は今
は、あなたはこのような何かを試すことができます。
今 'com_example'はグローバルオブジェクトの一部になるだろう、けれども。 'com_something_else'、' com_etc'のように多くのオブジェクトを追加したとしたら、グローバルオブジェクトのルートレベルを汚染しています。他のすべてのオブジェクトが追加されたグローバルでただ1つの 'com'オブジェクトがあれば、それは好ましくないでしょうか?また、複数のライブラリが使用されている場合、既存のオブジェクトを上書きすることはありません。 – Peter
@Peter:複数のライブラリで同じシンボルが定義されている場合は、何が問題であろうとも、そのため、jQueryのようなライブラリは、すべてのものを1つのグローバルオブジェクトにまとめるのに、そのような長さになります。私の要点は、複数のトップレベルオブジェクトを使用すべきではなく、深くネストされたオブジェクトを持つネームスペースを偽装するだけで、狂ったオブジェクト名よりも何も買わないということでした。もっと実用的な方法については私の最後の例を参照してください。衝突する可能性の低い単一のグローバル名を使用し、異種のコードでオブジェクトを追加する技術です。 – Shog9