装饰功能

44 javascript decorator babeljs ecmascript-next javascript-decorators

我看到babel.js装饰器(在"第1阶段"中可用)在https://github.com/wycats/javascript-decorators上实现了规范.看起来装饰器仅限于(1)类,(2)访问器和(3)方法.在我的例子中,我想在普通的旧函数上使用装饰器,如

@chainable
function foo() { }
Run Code Online (Sandbox Code Playgroud)

在哪里(只是一个例子)

function chainable(fn) {
  return function() {
    fn.apply(this, arguments);
    return this;
  };
}
Run Code Online (Sandbox Code Playgroud)

我没有看到装饰器不能应用于函数的任何逻辑原因.我的问题是,有没有办法实现这一目标?还是有一些很好的理由为什么功能无法装饰?

事实证明,在https://github.com/wycats/javascript-decorators/issues/4上存在一个问题.

Axe*_*yer 26

要执行装饰器,您要计算表达式并执行此操作以防止提升(即使对于变量声明,也会保留赋值的右侧).因此,它与提升的功能声明不兼容.

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

const func = @someDecorator('abc') (x, y) => { return x + y };
Run Code Online (Sandbox Code Playgroud)

唉,这并没有得到很多热情:https://esdiscuss.org/topic/decorators-for-functions

  • 关于在功能装饰时阻止吊装的主题的第一个建议+1,fwiw :) (2认同)
  • @Ajedi32:当有多个装饰器时,它读起来会好得多。考虑`decorator1('abc')(decorator2('def')(decorator3('ghi')((x, y) => ...)))` vs `@decorator1('abc') @decorator2(' def') @decorator3('ghi') (x, y) => ...`. 输入第一部分实际上花了我比它应该更长的时间来确保结束括号是正确的。 (2认同)

Leo*_*tny 6

你当然有一点意见.

但正如neo_blackcap指出的那样,函数装饰器不是ES7装饰器草稿的一部分.

因此,您可以做的最好的事情是开始讨论相应的跟踪器,以吸引社区关注您的提案.

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


Neo*_* Ko 1

我认为问题是函数装饰器还没有成为 ES7 草案。

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

  • @torazaburo 不,你可以写一个 babel 插件 (3认同)
  • https://github.com/ukari/javascript-let-decorators 有人已经做到了,很多人一直要求这个功能,但似乎没有合适的 babel 插件 (2认同)