Istanza di class anonima – è una ctriggers idea?

In ES6 possiamo fare classi anonime:

var entity = class { } 

Ma possiamo anche istanziarlo:

 var entity = new class { constructor(name) { this.name = name; } getName() { return this.name; } }('Foo'); console.log(entity.getName()); // Foo 

Che cosa si fa dietro, quale vantaggio porterà e quali caveat porter?

Istanza di class anonima – è una ctriggers idea?

Sì, molto brutto. Proprio come la new function() { … } era in ES5 .

Questo stile di scrittura porta alla creazione di una nuova funzione di costruzione e prototipo di object ogni volta che viene valutata l’espressione. Se crei più oggetti con questo approccio, non otterranno nessuno dei vantaggi di classi / prototipi.

Se hai inteso questo modello per creare un object singleton, hai fallito anche tu. Il costruttore è ancora creato ed è persino accessibile: una seconda istanza può essere facilmente creata usando il new entity.constructor , vanificando l’intero scopo.

Quindi non usarlo mai . Un semplice object letterale è molto più facile da scrivere, leggere e creare istanze:

 var entity = { name: 'Foo', getName() { return this.name; } }; console.log(entity.name); // Foo 

Non farti ingannare da altri linguaggi in cui il new class modello di new class è comune, funziona in modo molto diverso rispetto a JavaScript.

Potresti volere classi anonime se sai esattamente cosa stai facendo, stai creando una gerarchia di classi (cioè cose che vuoi copie di) in un sistema di metaprogrammazione ben congegnato, e non c’è altra elegante soluzione per l’estensione, per esempio

 { myImplementation: class extends MyBaseClass { someMethod(x) { super().someMethod(x); insert extended behavior } } } 

Naturalmente è ansible implementare quanto sopra con alcune funzioni magiche abusive che utilizzano Object.assign :

 { myImplementation: extendMagic(mySuper => ({ someMethod(x) { mySuper.someMethod(x); insert extended behavior } })) } 

o trovare un modo migliore per fare quello che stai facendo. Ma i casi d’uso inventati saranno occasionalmente (anche se raramente).