Esiste un modo per utilizzare la notazione ECMAScript6 class
per dichiarare una variabile di classe statica o un valore predefinito per una variabile di istanza? Senza class
quello che ho in mente sarebbe scritto comeVariabili membro nelle classi ES6
function MyClass(arg) { if(arg) this.arg = arg; }
MyClass.classVariable = 42;
MyClass.prototype.arg = "no arg specified";
La più ovvia notazione ES6-come a mio avviso sarebbe stato
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static let classVariable = 42;
let arg = "no arg specified";
}
Ma questo non funziona, dal momento che secondo il the current spec draft solo le produzioni di ClassElement sono statici e metodi di istanza e punto e virgola da soli. OK, si può usare un paio di metodi getter e setter per ottenere una semantica simile a quello che ho delineato, ma credo che con una severa penalizzazione delle prestazioni e con una sintassi davvero bizzarra.
C'è qualche bozza che suggerisce di includere variabili nella notazione class
, in un modo o nell'altro? In tal caso, qual è stata la sintassi suggerita, dove è stata pubblicata, dove è stato discusso, come è andata la discussione e qual è lo stato attuale delle cose su questo fronte? Così com'è, questa domanda non può essere risolta se nessuna di queste cose è stata discussa prima, a qualsiasi livello, ma lo ritengo improbabile.
Un po 'di background: attualmente sto giocando con il compilatore di chiusura Google eseguendo una compilazione avanzata, utilizzando ES6 come input. Perché funzioni, ho bisogno di un posto dove inserire le mie annotazioni di tipo per le variabili membro, e le ho usate usando la sintassi come /** @type {string} */ MyClass.prototype.arg;
che è un no-sem semantico in ECMAScript ma fornisce le informazioni sul tipo al compilatore di chiusura semplice e facile. Non ho ancora trovato un modo altrettanto piacevole per farlo con un costrutto class
. Ma se ti interessa affrontare questo aspetto, quello sarebbe un commento. La domanda di cui sopra riguarda le dichiarazioni dei membri che sono più che non opzionali, quindi è qui che dovrebbe rispondere una risposta.
penso 'class Foo {get foo() {return 123}}' è più vicino come si ottiene – kangax
Penso che la tecnica di @ kangax sia la migliore scommessa per qualsiasi cosa che agirà come una classe astratta. Ho avuto lo stesso problema; ecco un controller che ho scritto che può/non può darti alcune idee. Il costruttore della classe base fa tutto il lavoro pesante per funzionalità uniche (in questo caso unire gli array), quindi devi solo assicurarti che 'super()' sia sempre chiamato sui costruttori subclass: https://github.com/ affirmix/tungstenjs/blob/master/src/controller.js. Puoi vedere che le sottoclassi non sembrano troppo sgradevoli: https://github.com/affirmix/tungstenjs-todomvc/blob/master/src/todoitem-controller.j –