JavaScriptでクラスを使ったプログラムを書いているときに、生成済みのインスタンスの数が知りたい時はありませんか?
今回は生成済みのインスタンス数を確認する方法を紹介します。この方法は、クラスから生成されたインスタンスの個数が鍵になるプログラムを書くときに使うことができます。
生成されたインスタンスの数を確認する方法
次のようにすると、あるクラスからいくつのインスタンスが生成されたのかを知ることができます。
class Cat {
static catCount = 0; //生成されたインスタンスの個数
constructor() {
Cat.catCount = Cat.catCount + 1;
}
}
console.log(Cat.catCount); //表示: 0
const sora = new Cat();
console.log(Cat.catCount); //表示: 1
const kotaro = new Cat();
console.log(Cat.catCount); //表示: 2
const kinako = new Cat();
console.log(Cat.catCount); //表示: 3
9,11,13行目でnew演算子を使ってCatクラスのインスタンスを生成しています。インスタンスを生成するたびにCat.catcountという変数が1ずつ増えていることを確認できます。
生成されたインスタンスの数を数える仕組み
この方法では静的プロパティと呼ばれるものを使うことで、インスタンスの数を数えています。静的プロパティはクラスが持つことができる変数のことです。
簡単に説明すると、次のような仕組みで生成されたインスタンスの数を数えています。
- クラスに静的プロパティを定義する
- そのクラスからインスタンスが生成されるたびに静的プロパティに1をたす
- 静的プロパティの値を参照してインスタンスの個数を確認する
クラスに静的プロパティを定義する
クラス定義の中で、次のように書くことで、静的プロパティを持たせることができます。
class クラス名 {
static 変数名 = 値;
//省略
}
例えば、Catクラスの定義の中でcatCountという名前の静的プロパティを定義しています。
class Cat {
static catCount = 0; //生成されたインスタンスの個数
constructor() {
Cat.catCount = Cat.catCount + 1;
}
}
console.log(Cat.catCount); //表示: 0
const sora = new Cat();
console.log(Cat.catCount); //表示: 1
const kotaro = new Cat();
console.log(Cat.catCount); //表示: 2
const kinako = new Cat();
console.log(Cat.catCount); //表示: 3
インスタンスが生成されるたびに静的プロパティに1をたす
コンストラクタは、クラスからインスタンスを生成するたびに実行されるメソッドです。
このコンストラクタの中に、静的プロパティに対して1をたす処理を書くことで、クラスからインスタンスが生成されるたびにインスタンスの数を数え上げることになります。
class Cat {
static catCount = 0; //生成されたインスタンスの個数
constructor() {
Cat.catCount = Cat.catCount + 1;
}
}
console.log(Cat.catCount); //表示: 0
const sora = new Cat();
console.log(Cat.catCount); //表示: 1
const kotaro = new Cat();
console.log(Cat.catCount); //表示: 2
const kinako = new Cat();
console.log(Cat.catCount); //表示: 3
上に書いているように、コンストラクタの中で静的プロパティを参照する場合は
クラス名.静的プロパティの変数名
のように書きます。
静的プロパティの値を参照してインスタンスの個数を確認する
インスタンスの個数を使いたい場面で静的プロパティを参照します。この場合もコンストラクタ内で参照する時と同じように書きます。
class Cat {
static catCount = 0; //生成されたインスタンスの個数
constructor() {
Cat.catCount = Cat.catCount + 1;
}
}
console.log(Cat.catCount); //表示: 0
const sora = new Cat();
console.log(Cat.catCount); //表示: 1
const kotaro = new Cat();
console.log(Cat.catCount); //表示: 2
const kinako = new Cat();
console.log(Cat.catCount); //表示: 3
コメント