装饰器是notECMAScript 2016(又名 7)的一部分。装饰师目前在第二阶段选秀 https://tc39.github.io/proposal-decorators/一个功能在最终确定并成为语言的一部分之前要经历 4 个阶段。它们可能会在不久的将来集成到该语言中,但其功能和细节可能会发生变化。因此,您必须使用 Babel 等转译器将装饰器转换为 Node 运行时可以理解的代码(ECMAScript 2016),方法是安装transform-decorators https://babeljs.io/docs/plugins/transform-decorators/巴贝尔插件。
至于创建装饰器,您已经这样做了。每个装饰器只是一个包装另一个装饰器的函数,在您的情况下,根据用例提供参数target
, key
, and descriptor
. Your logger
功能:
function logger(target, key, descriptor) {
console.log("Cat snarling...");
return descriptor;
}
已经是装饰师了。上课属性和方法, target
指财产的类别,key
是属性名称,并且descriptor
是属性的描述符。然后调用装饰器并通过以下方式定义类的属性Object.defineProperty https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty一旦脱糖。你的例子可以归结为:
class Cat { }
let meowDescriptor = {
type: 'method',
initializer: () => () => {
console.log(' Meeeoow! ');
},
enumerable: false,
configurable: true,
writable: true
}
function logger(target, key, descriptor) {
console.log("Cat snarling...");
return descriptor;
}
meowDescriptor = logger(Cat.prototype, 'meow', meowDescriptor);
Object.defineProperty(Cat.prototype, 'meow', {
...meowDescriptor,
value: meowDescriptor.initializer()
});
对于类本身,装饰器采用一个参数,target
它描述了装饰类。我建议阅读一些文档 https://github.com/wycats/javascript-decorators/blob/master/README.md熟悉这个主题。