Оскільки ваше питання здебільшого стилістичне (не бажаючи заповнювати конструктор купою декларацій), воно також може бути вирішене стилістично.
Те, як я бачу це, у багатьох мовах на основі класу конструктор є функцією, названою назвою самого імені класу. Стилістично ми могли б використати це для створення класу ES6, який стилістично все ще має сенс, але не групує типові дії, що відбуваються в конструкторі, з усіма деклараціями властивостей, які ми робимо. Ми просто використовуємо фактичний конструктор JS як "область декларування", а потім робимо функцію класу з назвою, яку ми інакше трактуємо як область "інші елементи конструктора", називаючи її в кінці справжнього конструктора.
"використовувати суворо";
клас MyClass
{
// декларуйте лише свої властивості, а потім викликайте це.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';
}
конструктор () {
this.properties ();
робити що-небудь ();
}
}
Зауважте, що цей другий метод може виглядати більш чистим, але він також має властиву проблему, коли properties
його переосмислення, оскільки один клас за допомогою цього методу розширює інший. Щоб properties
уникнути цього, вам доведеться дати більше унікальних імен . У мого першого методу немає цієї проблеми, оскільки його підроблена половина конструктора однозначно названа на честь класу.
this.member = member
у вашому конструкторі з 20-30 параметрами?