Purtroppo, tutto ciò che puoi fare sono cose semplici come Object.assign
, ma se stai cercando di rimuovere la ridondanza di digitare tutti i parametri due volte (una volta nella firma del costruttore e una volta nell'assegnazione) non c'è molto che tu possa fare.
Detto questo, potresti fare un trucco come questo. Anche se non sono sicuro che lo sforzo e il minimo di offuscamento che ne derivano ne valga la pena.
var dependencies = ['param1', 'param2', 'param3'];
class Something {
constructor(...params) {
params.forEach((param, index) => this[dependencies[index]] = param);
}
}
var something = new Something('foo', 'bar', 'baz');
// something.param1 === 'foo'
In questo modo si sta utilizzando un singolo array di nomi degli argomenti, quindi utilizzando la stessa matrice come un punto di riferimento quando si creano le proprietà dell'istanza di Something
. Questo schema funzionerebbe bene in un'applicazione Angolare in cui si sta tentando di preservare i nomi delle dipendenze tramite la minimizzazione impostando la proprietà $inject
.
Something.$inject = dependencies;
PS - Benvenuti all'inferno ridondante di lingue classiche che ho pensato ho ricevuto da quando sono diventato uno sviluppatore JS: P
Onestamente, probabilmente si dovrebbe semplicemente usare un oggetto classico letterale meno hai davvero bisogno della formalità di una classe reale.
Modifica: Suppongo che si possa accettare un oggetto letterale nel costruttore se si desidera la semplicità di un letterale e la formalità di una classe effettiva.
class Something {
constructor(params) {
Object.keys(params).forEach((name) => this[name] = params[name]);
}
}
var something = new Something({
param1: 'foo',
param2: 'bar',
param3: 'baz'
});
Ma ora hai appena compiuto una classe in una classe dinamica che può essere istanziato con tutte le proprietà, un po 'come un oggetto letterale: P
solito Voglio una classe perché voglio formalizzare la oggetto e presentare un'API coerente e rigorosamente verificabile.
Ha bisogno di essere un corso? puoi usare l'oggetto stenopeico letterale per assegnare i parametri come proprietà senza ripetere i loro nomi anche una sola volta. – Touffy
Per rispondere alla tua ultima domanda, i decoratori non saranno di aiuto in quanto non possono essere collegati a un 'costruttore di classi – CodingIntrigue