JavaScriptのコンストラクタとプライベート変数
まず、コンストラクタを使うこと前提で。
コンストラクタ内でメソッドを定義する場合、プライベート変数を使うことができる。
よくあるカウント機能を持つサンプル。
function Nogi() { var count = 0; this.say = function () { count++; console.log(count); }; }
インスタンス毎に、プライベート変数 count が別々にカウントアップされていることが分かる。
var nogi = new Nogi(); nogi.say(); // 1 nogi.say(); // 2 nogi.say(); // 3 var nogi2 = new Nogi(); nogi2.say(); // 1 nogi2.say(); // 2 nogi2.say(); // 3
しかし、インスタンスを作るごとに、this.say()がコピーされてしまう。
普通、メソッドは prototype に定義する。
だが、prototypeでメソッドを定義する場合、プライベート変数を使うことはできない。
それっぽいことをやってみる。
function Nogi() {} Nogi.prototype.say = (function () { var count = 0; return function () { count++; console.log(count); } }());
インスタンスを複数作り、カウントアップ。
var nogi = new Nogi(); nogi.say(); // 1 nogi.say(); // 2 nogi.say(); // 3 var nogi2 = new Nogi(); nogi2.say(); // 4 nogi2.say(); // 5 nogi2.say(); // 6
変数 count が共用されている。そりゃ prototype 自体が共用されているので当たり前か。
count はクラス変数になっているとも言える。
ES6ならやりたいことが出来るかも。
でも今はES6のことは考えたくありません。さようなら。