6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2022年1月14日 JavaScript (JS Primer) 静的メソッド

インスタンスメソッドは、クラスをインスタンス化して利用します。 一方、クラスをインスタンス化せずに利用できる静的メソッド(クラスメソッド)もあります。

静的メソッドの定義方法はメソッド名の前に、staticをつけるだけです。

  • 静的メソッドはクラスメソッドです。
  • 定義方法はメソッド名の前にstatic をつけるだけです。
class クラス {
    static メソッド() {
        // 静的メソッドの処理
    }
}
// 静的メソッドの呼び出し
クラス.メソッド();

次のコードでは、配列をラップするArrayWrapperというクラスを定義しています。 ArrayWrapperはコンストラクタの引数として配列を受け取って初期化しています。 このクラスに配列ではなく要素そのものを引数に受け取ってインスタンス化できるArrayWrapper.ofという静的メソッドを定義します。

下のコードで定義しているarrayWrapperBはクラスのインスタンス化にnew演算子を用いていません。
クラスに定義したofという静的メソッドのコンストラクタの引数をrest parametersとして要素を受けつけてインスタンス化しています。

class ArrayWrapper {
    constructor(array = []) {
        this.array = array;
    }

    // rest parametersとして要素を受けつける
    static of(...items) {
        return new ArrayWrapper(items);
    }

    get length() {
        return this.array.length;
    }
}

// 配列を引数として渡している
const arrayWrapperA = new ArrayWrapper([1, 2, 3]);
// 要素を引数として渡している
const arrayWrapperB = ArrayWrapper.of(1, 2, 3);
console.log(arrayWrapperA.length); // => 3
console.log(arrayWrapperB.length); // => 3

復習

  • Rest parametersは、仮引数名の前に...をつけた仮引数のことで、残余引数とも呼ばれます。 Rest parametersには、関数に渡された値が配列として代入されます。

クラスの静的メソッドにおけるthisは、そのクラス自身を参照します。 そのため、先ほどのコードはnew ArrayWrapperの代わりにnew thisと書くこともできます。

重要なポイント

  • クラスの静的メソッドにおけるthisは、そのクラス自身参照します。

参考

JS primer 静的メソッド