Javascript でカプセル化する方法
しかしJavaScriptのオブジェクトも、プライベート変数とプライベートメソッドを持てることが分かりました。もちろん、JavaScriptは世界で最も誤解されたプログラミング言語であるため、理解している人はほとんどいません。
笑った。いや、俺ももちろん理解してなかったよ。なんで、勉強がてら俺メモ。
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 は聞きかじった知識だけで使っているしなぁ。
あと、
これも興味深かった。