Poiché il tuo problema è principalmente stilistico (non vuoi riempire il costruttore con un sacco di dichiarazioni), può essere risolto anche stilisticamente.
Per come la vedo io, molti linguaggi basati su classi hanno il costruttore come una funzione che prende il nome dal nome stesso della classe. Stilisticamente potremmo usarlo per rendere una classe ES6 che stilisticamente ha ancora senso ma non raggruppa le azioni tipiche che si svolgono nel costruttore con tutte le dichiarazioni di proprietà che stiamo facendo. Usiamo semplicemente l'attuale costruttore JS come "area di dichiarazione", quindi creiamo una funzione denominata classe che altrimenti trattiamo come "altra roba del costruttore", chiamandola alla fine del vero costruttore.
"usa rigoroso";
classe MyClass
{
// dichiara solo le proprietà e quindi chiama this.ClassName (); da qui
costruttore(){
this.prop1 = 'blah 1';
this.prop2 = 'blah 2';
this.prop3 = 'blah 3';
this.MyClass ();
}
// ogni sorta di altre cose "costruttive", non più confuse con le dichiarazioni
La mia classe() {
fare qualsiasi cosa();
}
}
Entrambi verranno chiamati quando viene costruita la nuova istanza.
A Sorta piace avere 2 costruttori in cui separare le dichiarazioni e le altre azioni del costruttore che si desidera intraprendere e stilisticamente non è difficile capire che è quello che sta succedendo.
Trovo che sia uno stile piacevole da usare quando si ha a che fare con molte dichiarazioni e / o molte azioni che devono avvenire durante l'istanza e che vogliono mantenere le due idee distinte l'una dall'altra.
NOTA : non uso molto intenzionalmente le idee idiomatiche tipiche di "inizializzazione" (come un metodo init()
o initialize()
) perché spesso vengono utilizzate in modo diverso. C'è una sorta di presunta differenza tra l'idea di costruire e inizializzare. Lavorando con i costruttori, le persone sanno che vengono chiamate automaticamente come parte dell'istanza. Vedendo un init
metodo che molte persone assumeranno senza una seconda occhiata che devono fare qualcosa nella forma di var mc = MyClass(); mc.init();
, perché in questo modo si inizializza in genere. Non sto cercando di aggiungere un processo di inizializzazione per l'utente della classe, sto cercando di aggiungere al processo di costruzione della classe stessa.
Mentre alcune persone possono fare un doppio take per un momento, questo è in realtà il punto del problema: comunica loro che l'intento è parte della costruzione, anche se questo li fa fare un po 'di doppio take e andare "non lo è come funzionano i costruttori ES6 "e dedica un secondo a guardare il costruttore reale per andare" oh, lo chiamano in fondo, vedo ", è molto meglio di NON comunicare quell'intento (o comunicarlo in modo errato) e probabilmente ottenere un sacco di le persone lo usano male, cercando di inizializzarlo dall'esterno e dalla posta indesiderata. È molto intenzionale allo schema che suggerisco.
Per coloro che non vogliono seguire quel modello, può funzionare anche l'esatto contrario. Inizialmente, inserire le dichiarazioni in un'altra funzione. Forse chiamalo "proprietà" o "publicProperties" o qualcosa del genere. Quindi metti il resto del materiale nel normale costruttore.
"usa rigoroso";
classe MyClass
{
proprietà() {
this.prop1 = 'blah 1';
this.prop2 = 'blah 2';
this.prop3 = 'blah 3';
}
constructor () {
this.properties ();
fare qualsiasi cosa();
}
}
Si noti che questo secondo metodo può sembrare più pulito ma presenta anche un problema intrinseco in cui properties
viene sovrascritto quando una classe che utilizza questo metodo ne estende un'altra. Dovresti dare nomi più univoci properties
per evitarlo. Il mio primo metodo non ha questo problema perché la sua metà falsa del costruttore ha un nome univoco dopo la classe.
this.member = member
nel tuo costruttore con 20-30 parametri?