web-dev-qa-db-ja.com

関数のデコレーター

Babel.jsデコレーター(「ステージ1」で利用可能)が https://github.com/wycats/javascript-decorators で仕様を実装していることがわかります。デコレータは(1)クラス、(2)アクセサ、および(3)メソッドに限定されているようです。私の場合、次のように、単純な古い関数でデコレータを使用します

@chainable
function foo() { }

ここで(単なる例)

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

デコレータを関数に適用すべきではないという論理的な理由はわかりません。私の質問は、これを達成する方法はありますか?または、関数を装飾できない理由はありますか?

https://github.com/wycats/javascript-decorators/issues/4 でこの問題が発生していることがわかりました。

42
user663031

デコレータを実行するには、式を評価し、それによりホイストを防ぎます(変数宣言であっても、代入の右側はそのままです)。したがって、ホイストされる関数宣言と互換性がありません。

回避策として、関数式、ジェネレーター関数式、矢印関数を装飾できるようにすることを提案しました。

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

残念ながら、あまり熱意はありませんでした: 機能の装飾

26

ここには確かにポイントがあります。

しかし neo_blackcapが指摘した のように、関数デコレーターは ES7デコレータードラフト の一部ではありません。

ですから、あなたができる最善のことは、 対応するトラッカーで議論を始める で、あなたの提案にコミュニティの注目を集めることです。

ES7デコレータは 開発の最初の段階 開発の第2段階 は、APIがまだ開発中であり、変更される可能性があることを意味します。

6

問題は、関数デコレータがES7ドラフトではなかったことだと思います。

もちろん、自分で関数デコレータを実装することもできます

1
Neo Ko