2015-08-02 13 views
35

Ich sehe, dass babel.js Decorators (verfügbar in "stage 1") die Spezifikation bei https://github.com/wycats/javascript-decorators implementieren. Es scheint, dass Decorators auf (1) Klassen, (2) Accessoren und (3) Methoden beschränkt sind. In meinem Fall möchte ich Dekorateure auf einfache alte Funktionen, wie inDekoratoren auf Funktionen

@chainable 
function foo() { } 

wo (nur ein Beispiel)

function chainable(fn) { 
    return function() { 
    fn.apply(this, arguments); 
    return this; 
    }; 
} 

ich auf keinen logischen Grund sehen nicht verwenden, warum Dekorateure sollte nicht in der Lage sein, auf Funktionen anzuwenden. Meine Frage ist, gibt es einen Weg, dies zu erreichen? Oder gibt es einen guten Grund, warum Funktionen nicht dekoriert werden können?

Es stellt sich heraus, dass ein Problem für diese bei https://github.com/wycats/javascript-decorators/issues/4 ausgelöst wird.

Antwort

2

Ich denke, das Problem ist Funktion Dekorator wurde nicht ES7 Entwurf.

Natürlich können Sie immer noch Ihre Funktion Dekorateur selbst implementieren

+0

Indem Sie es selbst implementieren, meinen Sie meinen eigenen Parser/Transpiler? –

+0

@torazaburo nein, du kannst ein babel plugin schreiben –

6

Sie haben sicherlich einen Punkt hier.

Aber als neo_blackcap pointed out, Funktion Dekorator sind nicht Teil der ES7 decorators draft.

Also, das beste, was Sie tun können, ist , um die Aufmerksamkeit der Gemeinde auf Ihren Vorschlag zu lenken.

ES7 Dekoratoren sind auf first stage of development, was bedeutet, dass ihre API noch in Entwicklung ist und könnte sich ändern.

21

Um einen Decorator auszuführen, werten Sie einen Ausdruck aus, und das verhindert das Hochziehen (selbst bei einer Variablendeklaration bleibt die rechte Seite einer Zuweisung erhalten). Daher ist es nicht kompatibel mit Funktionserklärungen, die ausgelöst werden.

Als Behelfslösung, schlug ich vor, Funktionsausdrücken, Generatorfunktion Ausdrücke Pfeil und Funktionen aktiviert eingerichtet werden könnte:

const func = @someDecorator('abc') (x, y) => { return x + y }; 

Ach, das ist nicht mit viel Begeisterung aufgenommen wurde: https://esdiscuss.org/topic/decorators-for-functions

+1

Anstelle von const func = @someDecorator ('abc') (x, y) => {x + y} zurückgeben; ', warum würdest du nicht einfach 'const' schreiben? func = someDecorator ('abc') ((x, y) => {x + y}); '? IMO, dass ein kleines Extra an Syntax in dieser Instanz nicht wirklich etwas bringt. – Ajedi32

+2

+1 für Ihren ersten Vorschlag auf den Thread über das Verhindern von hissen, wenn eine Funktion eingerichtet ist, fwiw :) – Hrishi

+0

@ Ajedi32: Wenn es mehrere Dekorateure gibt, liest es sich viel besser. Betrachte 'dekorator1 ('abc') (dekorator2 ('def') (dekorator3 ('ghi') ((x, y) => ...)))' vs '@ dekorator1 ('abc') @ dekorator2 (' def ') @ decorator3 (' ghi ') (x, y) => ... '. Die Eingabe dieses ersten Teils dauerte länger als nötig, um sicherzustellen, dass die abschließenden Parens korrekt waren. –