JavaScript > プライベート関数・変数を持つオブジェクトの定義

更新日 2012-07-21
広告

プライベート変数や、プライベート関数を持つオブジェクトを定義する方法を紹介します。

以下のようなパターンを使います。
// 名前空間を用意
var SWENG = {};
SWENG.myApp = {};

// オブジェクトを返す関数を定義
SWENG.myApp.testObj = function () {
     
    // プライベート変数
    var privateVar = 0;
     
    // プライベート関数
    var privateMethod = function () {
        privateVar++;
    };
     
    // return で、オブジェクトを返す
    return { 
        publicVar: 5, // パブリック変数
        publicMethod: function () { // パブリック関数
            // プライベート変数や、プライベート関数にアクセス可能
            privateMethod();
            print('privateVar is ' + privateVar);
            // 当然、パブリック変数にアクセス可能
            print('publicVar  is ' + this.publicVar++);
        }
    };

}();


// パブリックメソッドの呼び出し
SWENG.myApp.testObj.publicMethod(); // これで呼び出せる。

var obj1 = SWENG.myApp.testObj; // 1回、変数に代入して、呼び出してもよい。
obj1.publicMethod();

var obj2 = SWENG.myApp.testObj; // 再度、変数に代入してもよい。
obj2.publicMethod();

// プライベートメソッドの呼び出し (エラーになる)
obj1.privateMethod();

testObj関数は、返り値としてオブジェクトを返します。ただし、オブジェクトを返す前に、そのオブジェクトからしかアクセスできないプライベート変数とプライベート関数を定義しています。

これを実行すると以下のようになります。

$ rhino sample.js
privateVar is 1
publicVar  is 5
privateVar is 2
publicVar  is 6
privateVar is 3
publicVar  is 7
js: uncaught JavaScript runtime exception: TypeError: Cannot find function privateMethod in object [object Object].

最期に、privateMethodを呼び出そうとして、エラーになっています。

また、privateVarやpublicVarの値の変化から、testObj関数で返されるオブジェクトは「唯一」であることがわかります。testObj関数を2回呼び出しても、毎回オブジェクトが生成されるわけではないということです。

広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system