2017-05-15 4 views
7

Gibt es eine JavaScript-Syntax, die mir die folgende kurz und bündig tun können:Getter mit Pfeil Funktion Syntax

class MyClass { 
    static get myProp() { 
     return 1; 
    } 
} 

keine große Sache, aber ich würde gerne wissen, ob es etwas, das wie ein Pfeil war Funktion, die ich mache es nur ein wenig schlanke, so etwas wie läßt:

class MyClass { 
    static get myProp =() => 1; 
} 

ich weiß, ich könnte schreibe es so (wenn auch nicht ein sicheres Äquivalent):

class MyClass {} 
MyClass.myProp = 1; 

Oder diese schwieriger zu lesen und mehr Alternative:

class MyClass {} 
Object.define(MyClass, 'myProp', { get:() => 1; }); 

aber das fühlt sich an wie ein Missbrauch der class Syntax

+0

Siehe auch http://stackoverflow.com/questions/31362292/how-to-use-es6-arrow-in-class-methods - es scheint, Pfeil Methoden 'sind (noch?) An experimentelle ES7-Funktion –

+1

Die meisten Zeiten, wenn Leute 'static get myProp() {...} sie brauchen nicht wirklich Lese-Eigenschaft. Es ist nur idiomatisch, 'MyClass.myProp = 1' über' Konstruktor' zu heben (z. B. nützlich für AngularJS $ inject-Annotationen). Es gibt keine andere Alternative als die, die Sie aufgelistet haben. 'static get myProp =() => 1 'wird offensichtlich nicht unterstützt, da es keinen Grund gibt, es nur einer Funktion zuzuordnen. – estus

+2

Was meinst du mit "* obwohl kein sicheres Äquivalent *"? – Bergi

Antwort

2

Es gibt einen besseren Weg, es zu tun. Dies kann mit Babel Preset für die Klassentransformation geschehen. Die Voreinstellung für diese spezielle Funktion lautet "Preset-stage-2".

Die Dokumentation Seite von babel für Preset-Stufe-2: https://babeljs.io/docs/plugins/preset-stage-2/

Use Case: In Ihrer .bablerc die vorliegenden Datei Anzeige.

{ 
    "presets": ["stage-2"] 
} 

Hinweis: es ist ein separates Modul npm es so installieren vorher.

+0

Dies ist der richtige Weg. Das war eine Frage, die ich vor einiger Zeit gestellt habe und die wir jetzt schon seit einigen Monaten verwenden, obwohl wir 'transform-class-properties' einfach als Plugin ohne die Presets verwenden. – samanime

0

Sie können keine Pfeilfunktionen verwenden, um Klassenfunktionen innerhalb einer Klassendeklaration zu definieren. Der Versuch, dies zu tun, erzeugt einen Syntaxfehler.

Der folgende Code:

class MyClass { 
 
    static get myVal() { 
 
    console.log(this); 
 
    return 1; 
 
    } 
 

 
    static get yourVal =() => { 
 
    console.log(this); 
 
    return 2; 
 
    } 
 
}

Erzeugt diesen Fehler:

{ 
    "message": "Uncaught SyntaxError: Unexpected token =", 
    "filename": "https://stacksnippets.net/js", 
    "lineno": 19, 
    "colno": 22 
} 

Und diesen Code:

class MyClass { 
 
    dogs = (val) => { 
 
    console.log('Bark, bark', val); 
 
    } 
 
}

erzeugt diesen Fehler:

{ 
    "message": "Uncaught SyntaxError: Unexpected token =", 
    "filename": "https://stacksnippets.net/js", 
    "lineno": 14, 
    "colno": 12 
} 

Dieser Code:

class MyClass {} 
Object.define(MyClass, 'myProp', { get:() => 1; }); 

Ist nur die ES5 Version zu diesem Code:

class MyClass { 
    static get myProp() { return 1; } 
} 

Dieser Code:

class MyClass {} 
MyClass.myProp = 1; 

Is nicht myProp zum Prototyp der Klasse befestigen und ist das Äquivalent einer statischen Variablen. Aber dieser Wert kann geändert werden. Wenn Sie also eine Nur-Lese-Eigenschaft wollen, dann müssen Sie eine der oben genannten Setter ..

In diesem Code:

class MyClass { 
 
    static get myVal() { 
 
    return 1; 
 
    } 
 
} 
 
MyClass.yourVal = 33; 
 

 
console.log(MyClass.myVal); 
 
console.log(MyClass.yourVal);

wir die Ausgabe von 1 und 33 erhalten. Was ist das, was erwartet wurde?

+0

Eine der neueren Syntaxen erlaubt Pfeilfunktionen in Klassen, Sie müssen dazu nur eine babel-Transformation verwenden. – samanime

+0

Sie sagten nichts von Babel in Ihrer Frage zu verwenden. Ich habe die Regeln von ES6 dargelegt. Wenn Babel diese Regeln bricht, dann hört sich das so an, als sei Babel gebrochen. Ich würde mich freuen, wenn Sie meine Antwort nicht abschreiben, da meine Antwort den echten ES6-Regeln entspricht. – Intervalia

+0

Noch ist es nicht akzeptiert, aber es ist ein offizieller Vorschlag, der akzeptiert wird (Schritt 3 von 4): https: // github .com/tc39/Vorschlagsklassenfelder. Ich habe nicht explizit eine ES-Ebene angegeben, ich habe nur nach einer Syntax gefragt. – samanime