JavaScriptは関数でvarで定義した変数はローカル・プライベート変数になり関数の外部からは参照できない[2]。
// ローカル・プライベート変数は外部から参照できない。
// 外部からローカル変数を操作する必要があれば外部に操作用のインターフェース(特権メソッド)を公開する
// 一般的な方法
// getValueをインスタンスメソッドとして定義する。
// 各インスタンス固有の変数xの値を取得する。
var Hoge = function() {
// プライベート変数
var x = 'Private';
// インスタンスメソッド
this.getValue = function() {
return x;
}
}
var o = new Hoge();
console.log(o.getValue()); // Private
// プロトタイプメソッドを使う場合。
// プロトタイプメソッドはプライベート変数にアクセスできない。
var Foo = function() {
// プライベート変数
var x = 'Private ';
};
Foo.prototype.getValue = function() {
// プロトタイプメソッドからxにアクセスできない(x is not defined)
return x;
};
var o = new Foo();
console.log(o.getValue()); // x is not defined</p>
// プロトタイプメソッドをクロージャーの形で定義するとxを参照できる。
// ただしxの値は全インスタンスで共有される。
var Bar = function(value) {
var x = 'Private ' + value;
this.y = 'Public ' + value;
// プロトタイプメソッド
Bar.prototype.getValue = function() {
return x + ' - ' + this.y;
}
}
var b1 = new Bar('b1');
console.log(b1.getValue()); // Private b1 - Public b1
var b2 = new Bar('b2');
console.log(b2.getValue()); // Private b2 - Public b2
// xは共有されるのでPrivateはb2になる
console.log(b1.getValue()); // Private b2 - Public b1
» jsFiddle
[1] スコープが関数内で閉じている。
[2] インスタンスメソッドは各インスタンスがメソッドを持つことになるのでプロトタイプチェーンで参照するprototypeで同じことができればそちらの方が効率的。
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。