Ponieważ twój problem ma głównie charakter stylistyczny (nie chcesz wypełniać konstruktora wiązką deklaracji), możesz go rozwiązać również stylistycznie.
Z mojego punktu widzenia w wielu językach opartych na klasach konstruktor może być funkcją nazwaną po samej nazwie klasy. Stylistycznie możemy to wykorzystać, aby stworzyć klasę ES6, która stylistycznie ma sens, ale nie grupuje typowych działań zachodzących w konstruktorze ze wszystkimi deklaracjami własności, które wykonujemy. Po prostu używamy rzeczywistego konstruktora JS jako „obszaru deklaracji”, a następnie tworzymy klasę o nazwie funkcja, którą inaczej traktujemy jako obszar „innych rzeczy konstruktora”, nazywając ją na końcu prawdziwego konstruktora.
„użyj ścisłego”;
klasa MyClass
{
// zadeklaruj tylko swoje właściwości, a następnie wywołaj this.ClassName (); stąd
konstruktor(){
this.prop1 = „bla 1”;
this.prop2 = 'bla 2';
this.prop3 = 'bla 3';
this.MyClass ();
}
// wszelkiego rodzaju inne rzeczy „konstruktorskie”, już nie pomieszane z deklaracjami
Moja klasa() {
rób cokolwiek();
}
}
Oba zostaną wywołane w trakcie tworzenia nowej instancji.
Trochę tak, jakbyś miał 2 konstruktory, w których oddzielasz deklaracje i inne działania konstruktora, które chcesz podjąć, i stylistycznie sprawia, że nie jest zbyt trudno zrozumieć, że to się dzieje.
Uważam, że jest to dobry styl do użycia w przypadku wielu deklaracji i / lub wielu działań, które muszą się zdarzyć przy tworzeniu instancji i chcą oddzielić te dwie idee od siebie.
UWAGA : Bardzo celowo nie używam typowych idiomatycznych pomysłów „inicjalizacji” (jak metoda init()
lub initialize()
), ponieważ są one często używane inaczej. Istnieje pewna domniemana różnica między ideą konstruowania i inicjowania. Pracując z konstruktorami ludzie wiedzą, że są wywoływani automatycznie w ramach tworzenia instancji. Widząc init
metodę, którą wiele osób zakłada bez drugiego spojrzenia, że muszą robić coś podobnego var mc = MyClass(); mc.init();
, ponieważ zazwyczaj tak się inicjuje. Nie próbuję dodawać procesu inicjalizacji dla użytkownika klasy, próbuję dodać do procesu budowy samej klasy.
Chociaż niektórzy ludzie mogą przez chwilę zrobić podwójne ujęcie, to w rzeczywistości o to chodzi: komunikuje im, że zamiar jest częścią konstrukcji, nawet jeśli sprawia to, że robią trochę podwójnego ujęcia i iść ”to nie jest jak działają konstruktory ES6 ”i poświęć chwilę, by spojrzeć na rzeczywistego konstruktora, aby powiedzieć„ och, nazywają to na dole, rozumiem ”, to o wiele lepsze niż NIE komunikowanie tego zamiaru (lub niepoprawne komunikowanie go) i prawdopodobnie uzyskanie dużej ilości ludzie używają go źle, próbując zainicjować go z zewnątrz i śmieci. Jest to bardzo celowe dla wzoru, który sugeruję.
Dla tych, którzy nie chcą podążać za tym wzorem, może również działać dokładnie odwrotnie. Na początku wyeksportuj deklaracje do innej funkcji. Może nazwać to „właściwości” lub „publicProperties” lub coś w tym rodzaju. Następnie włóż resztę rzeczy do normalnego konstruktora.
„użyj ścisłego”;
klasa MyClass
{
nieruchomości() {
this.prop1 = „bla 1”;
this.prop2 = 'bla 2';
this.prop3 = 'bla 3';
}
konstruktor () {
this.properties ();
rób cokolwiek();
}
}
Zauważ, że ta druga metoda może wyglądać na czystszą, ale ma również nieodłączny problem polegający na tym, że properties
zostaje zastąpiona, gdy jedna klasa za pomocą tej metody rozszerza inną. properties
Aby tego uniknąć, musisz podać więcej unikalnych nazw . Moja pierwsza metoda nie ma tego problemu, ponieważ jej fałszywa połowa konstruktora ma unikalną nazwę od klasy.
this.member = member
u konstruktora z 20-30 parametrami?