Javascript は名前空間をネイティブにサポートしていないため、回避策が必要です。
JavaScript ライブラリを作成する場合、名前空間は重要な役割を果たします。グローバル関数やクラスを定義せずに、JavaScript ライブラリを構成する散在する JavaScript ファイル (*.js) を名前空間にカプセル化できます。たとえば、この章で何度も登場する person は、ライブラリの一部として適切な名前空間にカプセル化できます。
コード 5-13:
次のようにコードをコピーします。
var com = {};
com.anyjava = {};
com.anyjava.person = 関数(名前) {
//プライベートメンバー
var _name = 名前;
//アクセサ
this.getName = function() {
_name を返します;
};
this.setName = 関数(名前) {
_name = 名前;
};
};
//プロトタイプ
com.anyjava.person.prototype = {
食べる:関数() {
alert(this.getName() + " 何かを食べています。");
}、
スリープ:関数() {
alert(this.getName() + " は眠っています。");
}、
ウォーク:関数() {
alert(this.getName() + " 歩いています。");
}
};
var dirk = new com.anyjava.person("Dirk");
dirk.eat();
コード 5-13 から、Java 開発者の習慣により沿った名前空間が得られます。また、Person オブジェクトをインスタンス化するときに、コマンド空間パスも指定する必要があります。
ここでちょっとしたヒントを紹介します。他の人が開発した JavaScript ライブラリを使用し、比較的完全な名前空間計画を立てている場合、毎回長い名前空間を記述することにうんざりするかもしれません。たとえば、私が開発した JavaScript ライブラリを com.anyjava.control.ui 名前空間で使用している場合、使用したい拡張 UI コントロールが多数あるため、var xxx = new com と記述する必要はないと思います。 .anyjava.control.ui.XXX() を何度も繰り返します。コード 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 == "未定義") var com.anyjava = {};
このようにして、「com.anyjava」オブジェクトが 1 回だけ宣言されるようにすることができます。