ES6 эквивалент следующего шаблона?

Я хочу использовать статические свойства класса (stage-0) в классах ES6, например:

class Button {
  static size = {
    SMALL: "SMALL",
    BIG: "BIG"
  }
}

class UILibrary {
  consturctor() {
    this.button = new Button();
  }
}

// I can't access static properties of a class instance :(
const LibraryA = new UILibrary();
console.log(LibraryA.button.size.SMALL);

Какова лучшая альтернатива для этого?

РЕДАКТИРОВАТЬ:

Этот вопрос не о создании свойств класса в ES6/7, который уже поддерживается на этапе 0, ни о создании статических методов. Я просто ищу шаблон, который позволяет присоединять объекты типа enum к экземплярам классов. Следовательно, ни одно из дублирующих предложений вопросов не является действительным.

1 ответ

Я не могу получить доступ к статическим свойствам экземпляра класса:(

Да, если они являются статическими свойствами, вам нужно получить к ним доступ в конструкторе:

console.log(Button.size.SMALL);
console.log(LibraryA.button.constructor.size.SMALL);

(см. здесь для обсуждения различий)

Я просто ищу шаблон, который позволяет присоединять объекты типа enum к экземплярам классов.

Если вы хотите, чтобы они были доступны в инстансах, просто не делайте их static:

class Button {
  // without the experimental syntax, do the assignment in the constructor
  size = {
    SMALL: "SMALL",
    BIG: "BIG"
  }
}

или вместо того, чтобы уронить static ключевое слово, просто поместите их в прототип, чтобы объект не создавался снова и снова:

class Button {}
Button.prototype.size = {
  SMALL: "SMALL",
  BIG: "BIG"
};

Или, может быть, вам вообще не следует помещать их в класс, а просто использовать именованные экспорты модуля ES6.

Другие вопросы по тегам