你是对的,ES2016 装饰器还不是规范的一部分。但这并不意味着我们今天不能使用它。
首先让我们退后一步,回顾一下“什么是装饰器”。装饰器只是向对象添加行为的包装器。这在 javascript(或一般编程)中并不是一个新概念,它实际上已经存在了一段时间......
这是检查权限的装饰器的基本示例:
function AuthorizationDecorator(protectedFunction) {
return function() {
if (user.isTrusted()) {
protectedFunction();
} else {
console.log('Hey! No cheating!');
}
}
}
使用它看起来像这样:
AuthorizationDecorator(save);
您会看到我们所做的只是简单地包装一些其他功能。您甚至可以通过多个装饰器传递一个函数,每个装饰器添加一个功能或运行一些代码。
你甚至可以找到一些旧文章 http://addyosmani.com/blog/decorator-pattern/解释 javascript 中的装饰器模式。
既然我们了解装饰器实际上是我们(javascript 社区)始终能够做到的事情,那么当我们今天使用 ES2016 装饰器时,它们只是被编译为 ES5 代码,这可能并不令人震惊,这就是为什么要保持浏览器兼容性。所以目前它只是语法糖(我可能会添加一些非常甜的糖)。
至于使用哪个编译器将 ES2016 代码转换为 ES5 代码,您有一些选择:Babel https://babeljs.io/ and Traceur https://github.com/google/traceur-compiler是最受欢迎的。
这是进一步阅读探索 ES2016 装饰器 https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841#.ku11ts7sj.