これまでは、クラスのインスタンスに使用できるインスタンスメソッドについて説明してきましたが、インスタンス化せずに直接呼び出せるメソッドも存在します。

そこで今回は、staticメソッドと呼ばれるメソッドの使い方を解説していきます。

staticメソッド

staticメソッドとは、インスタンスを生成しなくても、クラスから直接呼び出すことのできるメソッドです。そのため、クラスメソッドとも呼ばれています。
また、staticキーワードはプロパティにも使用でき、その場合、staticプロパティと呼ばれます。

staticメソッドを定義するには、メソッド名の前にstaticを記述します。

class Classname {

  static method() {
    処理;
  }
}
// staticメソッドの呼び出し
Classname.method();

staticメソッドは、クラス単位のメソッドであるため、インスタンス自身を表すthisキーワードを使用することができません。
クラスが持っているプロパティという位置付けなので、インスタンスからstaticメソッドを呼び出すことができない点にも注意が必要です。

staticメソッドの使い方

では、staticメソッドの使い方を見てみましょう。
ここでは、Teacherというクラスを例にします。
各先生が受け持つ生徒数の平均値を返すメソッドを定義します。

class Teacher {
  constructor(props) {
    this.name = props.name;
    this.subject = props.subject;
    this.student = props.student;
  }
  // staticメソッドの定義、先生の受け持つ生徒数の平均
  static aveNumOfStudent(teachers = []) {
    if (teachers.length === 0) {
      return 0;
    } else {
      let sum = 0.0;
      // 各先生が受け持つ生徒数を足していく
      for (let teacher of teachers) {
        sum += teacher.student;
      }
      // 生徒数の合計÷先生の数
      return sum / teachers.length;
    }
  }
}

では、定義したメソッドを使ってみます。

// インスタンス化
const teacher1 = new Teacher({
  name: '山田 花子',
  subject: '理科',
  student: 35
});

const teacher2 = new Teacher({
  name: '田中 太郎',
  subject: '歴史',
  student: 32
});

const teacher3 = new Teacher({
  name: 'ジョン スミス',
  subject: '英語',
  student: 28
});
// staticメソッドの呼び出し
const average = Teacher.aveNumOfStudent([teacher1, teacher2, teacher3]);
console.log(average);

実行結果

// 31.666666666666668

Teacher.aveNumOfStudentによって、staticメソッドを呼び出しています。

生徒数の合計「95」を先生の数「3」で割ることにより、各先生が受け持つ生徒数の平均は「31.666…….人」ということが分かりました。

staticメソッドを使うメリット

staticメソッドにはどのようなメリットがあるのでしょうか。

上記の例から見られるように、クラス全体で共有する情報をまとめておく際にstaticメソッドが活用できます。クラスに関係する処理を用意しておくといったイメージです。

また、staticメソッドはオブジェクトの生成や複製を行うための関数など、いわゆるユーティリティとして良く使用されます。
ユーティリティとは、かんたんに言えば、プログラム上で良く使う機能をまとめておくことです。

例えば、以下のようにインスタンスを作成するための処理(インスタンスに対して利用するユーティリティメソッド)を書く際に役に立ちます。

class Teacher {
  constructor(props) {
    this.name = props.name;
    this.subject = props.subject;
    this.experience = props.student;
  }
  // staticメソッドの定義、インスタンスに対して作成
  static create(props) {
    return new Teacher(props);
  }
}

const props = {
  name: '山田 花子',
  subject: '理科',
  student: 35
};
// staticメソッドの呼び出し
teacher1 = Teacher.create(props);
console.log(teacher1.name); // "山田 花子"

このようにstaticメソッドを用いると、インスタンスメソッドを使わずにインスタンスを生成することができます。クラスが保有している機能という位置付けです。

まとめ

今回は、クラスのstaticメソッドについて解説しました。
インスタンスメソッドと比べると、クラスと直接の結び付きが強いことが分かります。

クラスに関係する処理の定義や、オブジェクトの生成や複製に使われているのが特徴的です。
そして、staticメソッドはクラス単位のメソッドとなるため、名前のバッティングを防ぐことにも期待ができます。

staticメソッドで得られるメリットを考えながら、取り入れてみてください。

合わせて読みたいクラスシリーズ

第1回:オブジェクト指向とクラス
第2回:クラスとメソッド -インスタンスメソッド・アクセッサプロパティ
第3回:クラスとメソッド -staticメソッド(当記事)
第4回:クラスの継承