[JavaScript]モジュールパターンでprivateぽい宣言をする方法

js
JavaScriptには他のプログラミング言語と違ってprivate・publicの宣言がありません。

では呼び出し元に特定の変数や関数を隠したい時って、privateのように隠蔽することはできないのでしょうか?

ご安心を!
JavaScriptでもモジュールパターンを使うことによって、privateのように特定の変数や関数を呼び出し元から隠すことができます。

今回はモジュールパターンを使って、変数・関数をprivateのように扱う方法を紹介していきます。

[スポンサーリンク]

モジュールパターンで隠蔽する

では、さっそくですがモジュールパターンを使って変数・関数を隠蔽していきましょう。

こちらのソースコードを見て下さい。こちらがモジュールパターンを使って隠蔽している例です。

var user = (function(){
    // letで宣言している部分は、userの呼び出し元からは参照できません。
    let name;
    let setFirstName = function(firstname) {
        user.name = user.name + " " + firstname;
    }
    return {
        set: function(lastname, firstname) {
            user.name = lastname;
            setFirstName(firstname);
        },
        get: function() {
            return user.name;
        }
    }

})();

// set/getメソッドの呼び出し
user.set("tanaka", "taro");
console.log(user.get()); //Object {id: 1, name: "nobisuke"}

3行目の変数と4行目の関数はuserを呼び出している元からは参照することも値を編集することもできません。

ではどこの部分が呼び出し元から参照することができるのでしょうか?

それは、7行目のreturnに定義されているset/getメソッドのみが外部から使うことができます。

そして3行目の変数と4行目の関数は、return内のメソッドからのみは参照・編集することができます。

3行目の変数の値を変更する場合は、必ずreturn内のメソッド経由で変更するということですね。

これで3行目の変数と4行目の関数を呼び出し元から隠蔽することができました。

末尾の()

上記のソースコードですが、プログラミングの経験が少しでもある人ならどこがprivate領域で、どこがpublic領域かというのは比較的簡単に理解できると思います。

ではuserの末尾にある()はどうでしょうか?

これってついてないといけないの?と思ってるんじゃないでしょうか。

はい、ついてないといけないんですよ。

この末尾の()ですが、即時関数という構文です。

即時関数とは関数を定義すると同時に実行するものです。詳しくはググってみて頂いたほうが速いと思うのでここでの説明は省略します。

さいごに

以上がモジュールパターンを使って変数・関数を隠蔽する方法でした。

小規模な構成ではあまり使う機会がないのかもしれませんが、そこそこの規模になってきてJavaScriptのモジュールをチーム単位で作成して、別のチームへ提供する時には便利で安全な宣言方法だと思います。

第三者へモジュール提供する場合は、使える部分を制限することもバグ減少につながりますからね。

モジュールパターンを積極的に使ってみてください。

それでは!