staticとは
class内で使用できる、静的なメソッドを定義する際のキーワードのことです。
以下にように、Person.hello()
と直接呼ぶことができます。
class Person {
static hello() {
console.log('hello');
}
}
Person.hello(); // hello
このように、インスタンス化を行わずに使用できるメソッドを静的メソッドまたはstaticメソッドと言います。
thisは使用できない
インスタンス化を行っていないので、Person
からインスタンスは生成されていません。
よってこの状態ではstaticメソッドの中でthisを使用することはできません。
class Person {
static hello() {
console.log('hello ' + this);
}
}
Person.hello();
出力結果↓
hello class Person {
static hello() {
console.log('hello ' + this);
}
}
this
にアクセスすると、クラスの表記自体が出力されます。
Person
からインスタンス化を行っていないので、このthis
が参照する先のオブジェクトがPerson
クラスになっています。
staticメソッドをコンストラクター関数で扱う
static
メソッドはコンストラクター関数を使うと以下のように記述できます。
function Person2(name, age) {
this._name = name;
this._age = age;
}
Person2.hello = function () {
console.log('hello');
};
Person2.hello(); // hello
Person
のstatic
メソッドのhello
が格納されたことになるので、Person.hello()
で呼び出すことができます。
class内のstaticメソッドの取り扱い
class
を用いた場合には、コンストラクター関数に対してメソッドが追加されたものをstatic
メソッドとして取り扱っています。
class Person {
constructor(name, age) {
this._name = name;
this._age = age;
}
static hello() {
console.log('hello');
}
}
const person = new Person('Taro', 20);
console.log(person.constructor === Person); // true
person
の中身は以下のようになっています。
[[Prototype]]
の中に、constructor
が追加されています。
こちらは先ほどのコンストラクター関数のことを指していて、person.constructor === Person
とすると結果はtrue
になります。
class
の場合もconstructor
は関数であり、Person
とイコールになります。
また、person
内の[[Prototype]]
の中のconstructor
にhello
メソッドが格納されていることがわかります。
よって、constructor
関数に対してhello
を追加したものが、static
メソッドということになります。
参考資料