web-dev-qa-db-fra.com

Décorateurs sur les fonctions

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

@chainable
function foo() { }

où (juste un exemple)

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

Je ne vois aucune raison logique pour laquelle les décorateurs ne devraient pas pouvoir s'appliquer aux fonctions. Ma question est, existe-t-il un moyen d'y parvenir? 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 à ce sujet sur https://github.com/wycats/javascript-decorators/issues/4 .

42
user663031

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

Comme solution de contournement, j'ai suggéré que les expressions de fonction, les expressions de fonction de générateur et les fonctions de flèche pourraient être activées pour être décorées:

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

Hélas, cela n'a pas rencontré beaucoup d'enthousiasme: Décorateurs de fonctions

26
Axel Rauschmayer

Vous avez certainement un point ici.

Mais comme neo_blackcap l'a souligné , le décorateur de fonction ne fait pas partie du projet des décorateurs ES7 .

Donc, la meilleure chose que vous puissiez faire est de démarrer la discussion sur le tracker correspondant pour attirer l'attention de la communauté sur votre proposition.

Les décorateurs ES7 sont sur leur première étape de développement deuxième étape de développement , ce qui signifie que leur API est toujours en cours de développement et pourrait subir toute modification.

6
Leonid Beschastny

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

Bien sûr, vous pouvez toujours implémenter vous-même votre décorateur de fonction

1
Neo Ko