Поскольку ваша проблема в основном стилистическая (не нужно заполнять конструктор кучей объявлений), ее можно решить и стилистически.
На мой взгляд, во многих языках на основе классов конструктор является функцией, названной в честь самого имени класса. Стилистически мы могли бы использовать это для создания класса ES6, который стилистически все еще имеет смысл, но не группирует типичные действия, выполняемые в конструкторе, со всеми объявлениями свойств, которые мы делаем. Мы просто используем фактический конструктор JS в качестве «области объявления», а затем создаем класс с именем function, который в противном случае мы рассматриваем как область «другого конструктора», вызывая его в конце истинного конструктора.
«использовать строгое»;
класс MyClass
{
// объявляем только ваши свойства и затем вызываем this.ClassName (); отсюда
конструктор(){
this.prop1 = 'бла 1';
this.prop2 = 'бла 2';
this.prop3 = 'бла 3';
this.MyClass ();
}
// всякие другие "конструкторы", больше не смешанные с объявлениями
Мои занятия() {
делай что угодно();
}
}
Оба будут вызываться при создании нового экземпляра.
Скорее, как если бы у вас было 2 конструктора, в которых вы разделяете объявления и другие действия конструктора, которые вы хотите выполнить, и стилистически делает это не слишком трудным для понимания того, что происходит.
Я считаю, что это хороший стиль, который нужно использовать при работе со многими объявлениями и / или множеством действий, которые необходимо выполнить при создании экземпляра и которые хотят отличить две идеи друг от друга.
ПРИМЕЧАНИЕ : я очень целенаправленно не использую типичные идиоматические идеи «инициализации» (например, init()
или initialize()
метод), потому что они часто используются по-разному. Существует некоторая предполагаемая разница между идеей конструирования и инициализации. Работая с конструкторами, люди знают, что они вызываются автоматически как часть реализации. Увидев init
метод, многие люди без второго взгляда предполагают, что им нужно что-то делать в форме var mc = MyClass(); mc.init();
, потому что именно так вы обычно инициализируете. Я не пытаюсь добавить процесс инициализации для пользователя класса, я пытаюсь добавить в процесс конструирования самого класса.
Хотя некоторые люди могут сделать двойной дубль на мгновение, в этом-то и кроется смысл: они сообщают им, что намерение является частью конструкции, даже если это заставляет их делать двойной дубль и уходить, это не так. как работают конструкторы ES6 "и взгляните на фактического конструктора, чтобы сказать:" О, они называют это снизу, я вижу ", это гораздо лучше, чем НЕ сообщать об этом намерении (или неправильно сообщать об этом) и, вероятно, получать много люди используют это неправильно, пытаясь инициализировать это извне и мусор. Это очень преднамеренно для шаблона, который я предлагаю.
Для тех, кто не хочет следовать этому шаблону, может работать и обратное. Передайте объявления в другую функцию в начале. Может быть, назовите его «свойства» или «publicProperties» или что-то. Затем поместите остальные вещи в обычный конструктор.
«использовать строгое»;
класс MyClass
{
свойства () {
this.prop1 = 'бла 1';
this.prop2 = 'бла 2';
this.prop3 = 'бла 3';
}
constructor () {
this.properties ();
делай что угодно();
}
}
Обратите внимание, что этот второй метод может выглядеть чище, но он также имеет внутреннюю проблему, которая properties
переопределяется, поскольку один класс, использующий этот метод, расширяет другой. Вы должны были бы дать больше уникальных имен, properties
чтобы избежать этого. Мой первый метод не имеет этой проблемы, потому что его фиктивная половина конструктора имеет уникальное имя в честь класса.
this.member = member
в вашем конструкторе с 20-30 параметрами?