56

我看到 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上提出了一个问题。

4

3 回答 3

30

要执行装饰器,您需要评估一个表达式并防止提升(即使对于变量声明,赋值的右侧也保持不变)。因此,它与被提升的函数声明不兼容。

作为一种解决方法,我建议可以启用函数表达式、生成器函数表达式和箭头函数来装饰:

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

唉,这并没有引起太大的热情:函数的装饰器

于 2015-11-25T12:02:11.383 回答
8

你肯定有一个观点。

但正如neo_blackcap 所指出的,函数装饰器不是ES7 装饰器草案的一部分。

因此,您能做的最好的事情就是在相应的跟踪器上开始讨论,以吸引社区对您的提案的关注。

ES7 装饰器处于第一阶段开发 第二阶段,这意味着他们的 API 仍在开发中,可能会发生任何变化。

于 2015-08-02T13:01:54.660 回答
1

我认为问题在于函数装饰器尚未成为 ES7 草案。

当然,你仍然可以自己实现你的函数装饰器

于 2015-08-02T12:53:52.120 回答