ECMAScript 2015 で導入された class 構文

1. このページの目的

ECMAScript 2015 で導入された class 構文についてポイントをまとめる。

2. class 構文

基本形

class Foo {
  // パブリックフィールド(ここでの記述は必須ではない)
  name = ''
  // プライベートフィールド(ここでの記述が必須)
  #age = 0;
  constructor(name, age) {
    // インスタンスの変数(プロパティ)
    this.name = name;
    this.#age = age;
  }

  // 静的メソッド (Foo.hello() というように使う)
  static hello() {

  }

  // プロトタイプメソッド
  say() {

  }

  // ゲッター(このクラスのインスタンスは、obj.hobby という形式でアクセスできる)
  get hobby() {
    return 'xxx';
  }
}

静的なプロパティ

静的なプロパティは、クラスの宣言外で定義しなければいけない。プロトタイプのプロパティも同様である。

Rectangle.staticWidth = 20;
Rectangle.prototype.prototypeWidth = 25;

Species

デフォルトコンストラクタ-をオーバライドすることができる。

class MyArray extends Array {
  // species を親の Array コンストラクターで上書きする
  static get [Symbol.species]() { return Array; }
}

let a = new MyArray(1,2,3);
let mapped = a.map(x => x * x);

console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array);   // true

ミックスイン

以下の関数を生成することで、ミックスインを実装することができる。

let calculatorMixin = Base => class extends Base {
  // 追加したいメソッド
  calc() {

  }
};

let randomizerMixin = Base => class extends Base {
  // 追加したいメソッド
  randomize() {

  }
};

上記の mix-ins を利用してクラスを作成する例

class Foo { }
class Bar extends calculatorMixin(randomizerMixin(Foo)) { }

3. メモ

参考

Private class fields について