Javascript でカプセル化する方法

しかしJavaScriptのオブジェクトも、プライベート変数とプライベートメソッドを持てることが分かりました。もちろん、JavaScriptは世界で最も誤解されたプログラミング言語であるため、理解している人はほとんどいません。

笑った。いや、俺ももちろん理解してなかったよ。なんで、勉強がてら俺メモ。

Public

オブジェクトの持つメンバは全て公開メンバだ。オブジェクトにメンバを追加する方法は次の2通り。

  1. コンストラクタ中で追加
  2. プロトタイプで追加

Private

プライベートメンバはコンストラクタ中で定義される。

function Container(param) {
    this.member = param;
    var secret = 3;
    var self = this;
}

param と secret と self がプライベートメンバとなる。外部からはもちろん、オブジェクトのパブリックメソッドからもアクセスできない。プライベートメンバにはプライベートメソッドからのみアクセスが可能だ。プライベートメソッドはコンストラクタ中で宣言されるインナーメソッドだ。

function Container(param) {

    function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var self = this;
}

プライベートメソッドはパブリックメソッドから直接呼び出すことはできない。そこで、privileged メソッドの出番だ。

Privileged

Privileged メソッドはプライベートメンバやプライベートメソッドにアクセスすることができる。そして、パブリックメソッドやオブジェクトの外部から呼び出すことができる。削除したり置き換えたりすることはできるが、変更することは出来ない。

Privileged メソッドはコンストラクタの中で this にアサインされる。

function Container(param) {

    function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var self = this;

    this.service = function () {
        if (dec()) {
            return self.member;
        } else {
            return null;
        }
    };
}

service が privileged メソッドだ。

Closure

このように public, private, privilged の仕組みを提供するのは Closure という機能である。

      • -

メモ終わり。解説されてみればそうだなぁ、と納得しました。ていうか、Javascript は聞きかじった知識だけで使っているしなぁ。

あと、

これも興味深かった。