我看到babel.js装饰器(在"阶段1"中可用)在https://github.com/wycats/javascript-decorators上实现了规范。看起来装饰器仅限于(1)类、(2)访问器和(3)方法。在我的例子中,我想在普通的旧的函数上使用装饰符,如
@chainable
function foo() { }
where(只是一个例子)
function chainable(fn) {
return function() {
fn.apply(this, arguments);
return this;
};
}
我看不出任何逻辑上的理由为什么装饰器不能应用于函数。我的问题是,有没有办法做到这一点?还是有一些很好的理由为什么功能不能装饰?
结果在https://github.com/wycats/javascript-decorators/issues/4上对此提出了一个问题。
要执行decorator,需要对表达式求值,这样做可以防止提升(即使对于变量声明,赋值的右侧也保持不变)。因此,它与被提升的函数声明不兼容。
作为一种解决方法,我建议函数表达式、生成器函数表达式和箭头函数可以被修饰:
const func = @someDecorator('abc') (x, y) => { return x + y };
唉,这并没有引起太大的热情:函数
你说得有道理。
但是正如neo_blackcap所指出的,函数装饰器不是ES7装饰器草案的一部分。
所以,你能做的最好的事情就是在相应的跟踪器上开始讨论,以吸引社区对你的提案的关注。
ES7装饰器处于第一开发阶段第二开发阶段,这意味着它们的API仍在开发中,可能会发生任何变化。
我认为问题是函数装饰器还没有ES7草案。
当然,你仍然可以自己实现你的函数装饰器