javascriptは名前空間の効果を簡単に実現します。


Javascript原生は名前空間をサポートしていません。
JavaScriptライブラリを作成する時に、名前空間は重要度を示すようになりました。このJavaScriptライブラリを構成する零細なJavaScriptファイル(*.js)を名前空間に封入して、大域の関数やクラスを定義する必要はありません。例えば、この章で何度も現れたPersonは、ライブラリの一部として適切な名前空間にカプセル化することができます。
コード5-13:

var com = {};
com.anyjava = {};
com.anyjava.Person = function(name) {
    //
    var _name = name;

    //
    this.getName = function() {
        return _name;
    };
    this.setName = function(name) {
        _name = name;
    };
};
//
com.anyjava.Person.prototype = {
    eat:function() {
        alert(this.getName() + " is eating something.");
    },
    sleep:function() {
        alert(this.getName() + " is sleeping.");
    },
    walk:function() {
        alert(this.getName() + " is walking.");
    }
};
var dirk = new com.anyjava.Person("Dirk");
dirk.eat();
はコード5-13からJava開発者の習慣に合った名前空間を得ました。また、Personオブジェクトを実用化する際にもコマンド空間パスを指定します。ここでは、他の人が開発したものを使っていて、より完全な名前空間計画を持っているJavaScriptライブラリを使っていると、いつも長たらしい名前空間に飽きてしまうかもしれません。例えば、JavaScriptライブラリを使っています。comp.anyjava.co ntrol.uiの名前空間の下で、多くのお客様が使う拡張UIコントロールがあります。何度も書いてほしいと思わないかもしれません。名前空間の別名を指定することによって、コードをより少なく書くことができます。コード5-14に示すもう一つの実用化コード5-13のPersonの方法:
コード5-14:

var ns = com.anyjava;
var dirk = new ns.Person("Dirk");
dirk.eat();
最後に私が説明するのは、名前空間を使う時に注意しなければならない問題です。JavaScriptライブラリを書く時、大多数の場合、名前空間ステートメント文は同時にJavaScriptファイルの複数の位置に現れたり、複数のJavaScriptファイルが出現したりするかもしれませんが、JavaScript言語の特性は最後に宣言された変数が前の宣言の同名変数をカバーするので、これは繰り返し声明の問題に注意しなければなりません。つまり、名前空間オブジェクトを宣言するたびに、コード5-15に示すように、名前空間オブジェクトが既に存在しているかどうかを判断することを提案する。
コード5-15:

if (typeof com.anyjava == "undefined") var com.anyjava = {};
これで私達は「come.anyjava」の対象が一回だけ宣言されることを保証できます。