6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaScriptのstaticを理解する

Last updated at Posted at 2021-12-07

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

Personstaticメソッドの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の中身は以下のようになっています。
スクリーンショット 2021-12-08 7.25.01.png
[[Prototype]]の中に、constructorが追加されています。
こちらは先ほどのコンストラクター関数のことを指していて、person.constructor === Personとすると結果はtrueになります。

classの場合もconstructorは関数であり、Personとイコールになります。
また、person内の[[Prototype]]の中のconstructorhelloメソッドが格納されていることがわかります。

よって、constructor関数に対してhelloを追加したものが、staticメソッドということになります。

参考資料

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?