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

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

staticメソッド

「staticメソッド」とは、インスタンスを生成しなくても、クラスから直接呼び出すことのできるメソッドです。そのため、「クラスメソッド」とも呼ばれています。

また、staticキーワードはプロパティにも使用でき、その場合、「staticプロパティ」と呼ばれます。

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

class Classname {

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

staticメソッドは、クラス単位のメソッドであるため、インスタンス自身を表すthisキーワードを使用することができません。

クラスが持っているプロパティという位置付けなので、インスタンスから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メソッドが活用できます。すなわち、クラスに関係する処理を用意しておくといったイメージです。

また、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メソッドは、クラス単位のメソッドとなるため、名前のバッティングを防ぐことにも期待ができます。

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

JavaScript関連記事