JavaScript 第5版 - 10章 モジュールと名前空間

JavaScript 第5版の「10章 モジュールと名前空間」(189~206ページ)を読み進めていきます。

  • オープンソースのJavaScriptモジュールコレクションとして、PerlのCPANにならって作成されたJSANがある。

10.1 モジュールと名前空間の生成

モジュールの開発では、名前空間の衝突を避けるため、1つのグローバルシンボルにモジュールのオブジェクトを追加していくようにします。

var Class = {};  // グローバルシンボル
Class.define = function(data) { /* コード */ };
Class.provides = function(o, c) { /* コード */ };

グローバルシンボルをその存在をチェックしてから生成する場合には、宣言されていないグローバルオブジェクトを読み出すと例外がスローされるため、最初にグローバルシンボルとなる変数の宣言だけはしておく必要があります。

名前空間が衝突する可能性をより減少させるために、ファイル名ベースとドメイン名ベースのルールとコードの例が掲載されています。

10.2 名前空間からのシンボルのインポート

モジュールのグローバルシンボルをインポート(別の変数に代入)することで、モジュールの利用者は短い名前空間でモジュールを利用することができるようになります。ただし、インポートできるのはオブジェクト(関数・配列を含む)を参照しているものだけです。これは、オブジェクトでは参照がコピーされるのに対して、基本型では値がコピーされるからです(3章15節を参照)。

10.2.2 プライベートな名前空間とスコープとしてのクロージャ

  • クロージャを使って、プライベートな名前空間を定義することによって、次のような利点がある。
    • 同じ名前空間中の関数から他の関数やプロパティへアクセスする際に、完全な修飾名を使う必要がない。
    • パブリックなプロパティだけをパブリックな名前空間にエクスポートすることができる。
// エラーチェックは省略。
var com;
if (!com) com = {};
if (!com.davidflanagan) com.davidflanagan = {};
com.davidflanagan.Class = {};

// 匿名関数が生成するクロージャによって、プライベートな名前空間が提供される。
(function() {
    function define(data) { counter ++; /* コード */ }
    function provides(o, c) { /* コード */ }

    var counter = 0;

    // プライベートな名前空間中なので、単純な名前で変数を参照できる。
    function getCounter() { return counter; }

    // パブリックなプロパティのみをエクスポート。
    var ns = com.davidflanagan.Class;
    ns.define = define;
    ns.provides = provides;
    ns.getCounter = getCounter;
})();

10.3 モジュールユーティリティ

モジュール開発を便利にするためのユーティリティモジュールが、200ページの「例 10-5」に掲載されています。

コメント (0)

この記事へのコメントはまだありません。

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/91/trackback/
この記事のURI
http://dxd8.com/archives/91/