次のコードでは、作成されたPersonオブジェクトの数を追跡するためのカウンターが必要です。このコードはそうしていませんが、どうすればそれを達成できますか?
function Person(){
this.name = "Peter";
this.counter = this.counter + 1;
alert(this.counter);
}
Person.prototype.counter = 0;
var p1 = new Person;
var p2 = new Person;
function Person(){
this.name = "Peter";
Person.counter++;
alert(Person.counter);
}
Person.counter = 0;
var p1 = new Person();
var p2 = new Person();
「静的」変数をPerson
ではなくprototype
関数のプロパティにし、コンストラクター内でPerson
の代わりにthis
を使用します。
これが可能なのは、JavaScript関数がファーストクラス(つまり、オブジェクト)であり、独自のプロパティを持つことができるためです。
上記のコードの 実行例 を次に示します。
また、カウンター変数を「プライベート」にして、クロージャーに対してローカルとして宣言することもできます。プライベート-静的変数に似たものを作成するのに最適な方法です。
var Person = (function() {
var counter = 0;
return function() {
counter++;
this.name = "Peter";
alert(counter);
};
})();
var p1 = new Person();
var p2 = new Person();
静的プロパティはありません。必要に応じて、Person
関数にデータを保存できます。
function Person(){
this.name = "Peter";
Person.counter++;
alert(Person.counter);
}
静的の場合、プロパティを関数オブジェクト自体に割り当てることができます。
Person.counter = 0;
そして、コンストラクタ内で次のように増分します。
Person.counter += 1;
未定義をチェックして、コンストラクター内でPerson.counter
を作成することもできます
function Person(){
if (typeof Person.counter === 'undefined')
Person.counter = 0;
else
Person.counter += 1;
...
Jsには静的クラス変数/プロパティのようなものはありません。最も単純なアプローチは、静的変数の名前空間として「クラス」関数を使用することです。
つまり、Person.countに直接アクセスするだけです。
クロージャーも使用できますが、実際には90%の場合、過剰になります。最新のブラウザでは、getter/setter関数を再定義して、Person.countおよびその他の「静的」変数の使用をラップすることもできます。
このスニペットはアイデアを示しています。
function borrow(obj, borrowobj, fname) {
obj.__defineGetter__(fname, function() {
return borrowobj[fname]
})
obj.__defineSetter__(fname, function(val) {
borrowobj[fname] = val
})
}
function Person() {
borrow(this, Person, "count");
this.count++
}
Person.count = 0;
new Person();
new Person();
var p = new Person();
alert(p.count);