2015-08-02 2 views
35

Je vois que les décorateurs babel.js (disponibles en "étape 1") implémentent la spécification à https://github.com/wycats/javascript-decorators. Il semble que les décorateurs soient limités à (1) classes, (2) accesseurs et (3) méthodes. Dans mon cas, je veux utiliser les décorateurs sur bon vieux fonctions, comme dansDécorateurs sur les fonctions

@chainable 
function foo() { } 

où (juste un exemple)

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

Je ne vois aucune raison logique pourquoi les décorateurs ne devraient pas être capable de s'appliquer aux fonctions. Ma question est la suivante: existe-t-il un moyen d'accomplir cela? Ou y a-t-il une bonne raison pour laquelle les fonctions ne peuvent pas être décorées?

Il s'avère qu'il y a un problème soulevé pour cela à https://github.com/wycats/javascript-decorators/issues/4.

Répondre

2

Je pense que le problème est la fonction décorateur n'a pas été ébauche ES7.

Bien sûr, vous pouvez toujours mettre en œuvre votre décorateur de fonction par vous-même

+0

En l'implémentant moi-même, vous voulez écrire mon propre analyseur/transpileur? –

+0

@torazaburo non, vous pouvez écrire un plugin babel –

6

Vous avez certainement un point ici.

Mais comme neo_blackcap pointed out, les décorateurs de fonction ne font pas partie du ES7 decorators draft. Donc, la meilleure chose que vous pouvez faire est de start discussion on the corresponding tracker pour attirer l'attention de la communauté sur votre proposition.

Les décorateurs ES7 sont sur leur first stage of development, ce qui signifie que leur API est encore en cours de développement et pourrait subir tout changement.

21

Pour exécuter un décorateur, vous évaluez une expression et cela empêche le levage (même pour une déclaration de variable, le côté droit d'une assignation reste en place). Par conséquent, il n'est pas compatible avec les déclarations de fonction hissées.

En tant que travail autour, je suggère que les expressions de la fonction, les expressions de la fonction générateur et les fonctions de direction peuvent être activés à décorer:

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

Hélas, cela n'a pas été rencontré beaucoup d'enthousiasme: https://esdiscuss.org/topic/decorators-for-functions

+1

Au lieu de 'const func = @someDecorator ('abc') (x, y) => {return x + y};', pourquoi ne pas simplement écrire 'const func = someDecorator ('abc') ((x, y) => {return x + y}); '? IMO ce petit supplément de syntaxe ne vous apporte vraiment rien dans ce cas. – Ajedi32

+2

+1 pour votre première suggestion sur le sujet de la prévention de levage quand une fonction est décorée, fwiw :) – Hrishi

+0

@ Ajedi32: quand il ya plusieurs décorateurs, il se lit beaucoup mieux. Considérons 'decorator1 ('abc') (decorator2 ('def') (décorateur3 ('ghi') ((x, y) => ...)))' vs '@ decorator1 ('abc') @ decorator2 (' def ') @ decorator3 (' ghi ') (x, y) => ... '. Taper cette première partie m'a en fait pris plus de temps que nécessaire pour m'assurer que les parens de clôture étaient corrects. –