JavaScript アドバンス

JavaScript クラス

ECMAScript 2015(通称 ES6)において、JavaScript にクラス(Classes)が導入されました。
JavaScript クラスは、オブジェクトを作成するためのテンプレート(設計図)です。

1. JavaScript クラスの構文

クラスを作成するには class キーワード(Keyword)を使用します。
また、必ず constructor() という名前のメソッドを追加します。

構文

class ClassName {
  constructor() { ... }
}

class Car {
  constructor(name, year) {
    this.name = name;
    this.year = year;
  }
}

上記の例では「Car」という名前のクラスを作成しています。
このクラスは「name」と「year」という2つの初期プロパティを持っています。

2. クラスの使用

クラスを定義すると、それを使ってオブジェクトを作成(インスタンス化)できるようになります。

const myCar1 = new Car("Ford", 2014);
const myCar2 = new Car("Audi", 2019);

上記の例では、Car クラスを使用して2つの Car オブジェクトを作成しています。
新しいオブジェクトが作成される際、constructor メソッドが自動的に呼び出されます。

3. コンストラクタメソッド (The Constructor Method)

constructor メソッドは特殊なメソッドです:

  • 名前は必ず「constructor」である必要があります。
  • 新しいオブジェクトが作成されるときに自動的に実行されます。
  • オブジェクトのプロパティを初期化するために使用されます。

もし constructor メソッドを定義しなかった場合、JavaScript は空のコンストラクタメソッドを自動的に追加します。

4. クラスメソッド (Class Methods)

クラスメソッドは、オブジェクトメソッドと同じ構文で作成されます。
class キーワードでクラスを作成し、constructor() メソッドを追加した後に、任意の数のメソッドを記述できます。

構文

class ClassName {
  constructor() { ... }
  method_1() { ... }
  method_2() { ... }
  method_3() { ... }
}

車の「車齢」を返す「age」という名前のクラスメソッドを作成する例:

class Car {
  constructor(name, year) {
    this.name = name;
    this.year = year;
  }
  age() {
    const date = new Date();
    // 現在の年から製造年を引いて車齢を算出します
    return date.getFullYear() - this.year;
  }
}

const myCar = new Car("Ford", 2014);
document.getElementById("demo").innerHTML =
"私の車は " + myCar.age() + " 歳です。";

クラスメソッドには引数(Parameters)を渡すこともできます:

class Car {
  constructor(name, year) {
    this.name = name;
    this.year = year;
  }
  // 引数 x を受け取るメソッド
  age(x) {
    return x - this.year;
  }
}

const date = new Date();
let year = date.getFullYear();

const myCar = new Car("Ford", 2014);
document.getElementById("demo").innerHTML =
"私の車は " + myCar.age(year) + " 歳です。";

5. ストリクトモード (use strict)

クラスの構文は、常に "use strict" ディレクティブ(Directive)に従って記述される必要があります。
ストリクトモード(厳格モード)のルールに従わない場合、エラーが発生します。

「ストリクトモード」では、変数を宣言せずに使用するとエラーになります:

class Car {
  constructor(name, year) {
    this.name = name;
    this.year = year;
  }
  age() {
    // date = new Date();   // これはエラーになります(未宣言)
    const date = new Date(); // これは正常に動作します
    return date.getFullYear() - this.year;
  }
}