装饰功能

时间:2015-08-02 12:24:55

标签: javascript babeljs decorator ecmascript-next

我看到babel.js装饰器(在"阶段1和#34中可用;)在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已经提出了一个问题。

3 个答案:

答案 0 :(得分:26)

要执行一个装饰器,你要计算一个表达式,这样做可以防止提升(即使对于一个变量声明,一个赋值的右边也会保持不变)。因此,它与提升的函数声明不兼容。

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

const func = @someDecorator('abc') (x, y) => { return x + y };
唉,这并没有得到很多热情:https://esdiscuss.org/topic/decorators-for-functions

答案 1 :(得分:6)

你当然有一点意见。

但是neo_blackcap pointed out,函数装饰器不是ES7 decorators draft的一部分。

因此,您可以做的最好的事情是start discussion on the corresponding tracker以吸引社区关注您的提案。

ES7修饰符在first stage of development上,这意味着它们的API仍在开发中,可能会发生任何变化。

答案 2 :(得分:2)

我认为问题是功能装饰器还没有被ES7草案。

当然,您仍然可以自己实现功能装饰器