web-dev-qa-db-ja.com

ECMAScript 6には抽象クラスの規則がありますか?

ES6を読んでいるときに、抽象クラスについて何も見つからなかったことに驚きました。 (「抽象クラス」では、抽象クラスがインスタンス化可能にするためにサブクラスが実装しなければならないメソッドシグネチャを宣言するJavaの意味について話しています)。

ES6で抽象クラスを実装するために定着している規則を知っている人はいますか?静的分析で抽象クラス違反をキャッチできると便利です。

実行時にエラーを発生させて、抽象クラスのインスタンス化の試みを知らせる場合、エラーはどうなりますか?

139
obelia

ES2015には、目的のデザインパターン用の組み込みアフォーダンスを持つJavaスタイルのクラスはありません。ただし、何を達成しようとしているかに応じて、役立つオプションがいくつかあります。

構築できないが、サブクラスは構築できるクラスが必要な場合は、new.targetを使用できます。

class Abstract {
  constructor() {
    if (new.target === Abstract) {
      throw new TypeError("Cannot construct Abstract instances directly");
    }
  }
}

class Derived extends Abstract {
  constructor() {
    super();
    // more Derived-specific stuff here, maybe
  }
}

const a = new Abstract(); // new.target is Abstract, so it throws
const b = new Derived(); // new.target is Derived, so no error

new.target の詳細については、ES2015のクラスがどのように機能するかの一般的な概要をお読みください: http://www.2ality.com/2015/02/es6-classes- final.html

特定のメソッドを実装する必要がある場合は、スーパークラスコンストラクターでも確認できます。

class Abstract {
  constructor() {
    if (this.method === undefined) {
      // or maybe test typeof this.method === "function"
      throw new TypeError("Must override method");
    }
  }
}

class Derived1 extends Abstract {}

class Derived2 extends Abstract {
  method() {}
}

const a = new Abstract(); // this.method is undefined; error
const b = new Derived1(); // this.method is undefined; error
const c = new Derived2(); // this.method is Derived2.prototype.method; no error
261
Domenic