Gibt es eine Möglichkeit, die Notation ECMAScript6 class
zu verwenden, um entweder eine statische Klassenvariable oder einen Standardwert für eine Instanzvariable zu deklarieren? Ohne class
, was ich im Sinn haben würde alsMitgliedsvariablen in ES6-Klassen
function MyClass(arg) { if(arg) this.arg = arg; }
MyClass.classVariable = 42;
MyClass.prototype.arg = "no arg specified";
geschrieben werden
Die naheliegendste ES6 ähnliche Schreibweise meiner Meinung nach
gewesen wäreclass MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static let classVariable = 42;
let arg = "no arg specified";
}
Aber das funktioniert nicht, da the current spec draft nach dem Nur Produktionen von ClassElement sind statische und Instanzmethoden und Semikolons alle von selbst. OK, man kann ein Paar von Getter- und Setter-Methoden verwenden, um eine ähnliche Semantik zu erreichen, wie ich es skizziert habe, aber ich schätze, dass es eine starke Leistungseinbuße und eine wirklich bizarre Syntax gibt.
Gibt es einen Entwurf, der vorschlägt, Variablen in die Notation class
einzuschließen, auf die eine oder andere Art? Wenn ja, wie war die vorgeschlagene Syntax, wo wurde sie veröffentlicht, wo wurde sie diskutiert, wie lief die Diskussion und wie ist der aktuelle Stand der Dinge an dieser Front? So wie es aussieht, kann diese Frage nicht beantwortet werden, wenn vorher auf keiner Ebene etwas darüber diskutiert wurde, aber ich halte das für unwahrscheinlich.
Ein bisschen Hintergrund: Ich spiele gerade mit dem Google Closure-Compiler, der eine erweiterte Kompilierung durchführt, mit ES6 als Eingabe. Damit das funktioniert, brauche ich einen Platz, um meine Typ-Annotationen für Member-Variablen zu platzieren, und ich habe sie mit der Syntax /** @type {string} */ MyClass.prototype.arg;
platziert, was ein semantisches No-Op in ECMAScript ist, aber die Typinformationen für den Closure-Compiler schön und einfach bereitstellt. Ich habe noch keinen ähnlich schönen Weg gefunden, dies mit einem class
Konstrukt zu tun. Aber wenn Sie diesen Aspekt ansprechen möchten, wäre das ein Kommentar. Bei der obigen Frage geht es um Mitgliedererklärungen, bei denen es sich um mehr als nur No-Ops handelt. Das sollten wir hier diskutieren.
Ich denke 'class Foo {foo get() {return 123}}' so nah wie es wird – kangax
Ich denke @ kangax Technik ist die beste Wette für alles, was als eine abstrakte Klasse fungieren wird. Ich hatte das gleiche Problem; Hier ist ein Controller, den ich geschrieben habe, der Ihnen vielleicht einige Ideen geben kann. Der Konstruktor der Basisklasse führt alle schweren Aufgaben für eine einzigartige Funktionalität aus (in diesem Fall das Zusammenführen von Arrays). Sie müssen also nur sicherstellen, dass 'super()' immer für Unterklassenkonstruktoren aufgerufen wird: https://github.com/ affirmix/wolframjs/blob/master/src/controller.js. Sie können sehen, dass Sub-Klassen nicht zu fies aussehen: https://github.com/affirmix/tungstenjs-todomvc/blob/master/src/todoitem-controller.j –