Подтвердить что ты не робот

Имеет ли ECMAScript 6 соглашение для абстрактных классов?

Я был удивлен, что ничего не узнал об абстрактных классах при чтении на ES6. (Под "абстрактным классом" я говорю о значении Java, в котором абстрактный класс объявляет сигнатуры методов, которые должен реализовывать подкласс, чтобы быть реалистичным).

Кто-нибудь знает какие-либо соглашения, принятые для реализации абстрактных классов в ES6? Было бы неплохо уловить абстрактное нарушение класса со статическим анализом.

Если бы я должен был вызвать ошибку во время выполнения, чтобы сигнализировать о попытке создания абстрактного класса, какова будет ошибка?

4b9b3361

Ответ 1

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