类的装饰器

  1. @decorator
  2. class A{}
  3. function decorator(target) {
  4. target.dec = true;
  5. }

上述代码给类A添加了一个静态属性。装饰器的实质就是调用函数,让代码看起来更简单明了。类的装饰器函数接受一个参数,代表这个类。即上述代码中 target === A。如果想要传入多个参数,可以利用闭包。
类的装饰器基本上可以用下面代码来实现。

  1. class A{}
  2. A = decorator(A) || A

方法的装饰器

  1. class A{
  2. @readonly
  3. say() {}
  4. }
  5. function readonly(p, key, descriptor) {
  6. // p 即 A.prototype
  7. // key 即 'say'
  8. // descriptor 即 say在A.prototype上的描述对象
  9. // 默认是
  10. // {
  11. // value: specifiedFunction,
  12. // enumerable: false,
  13. // configurable: true,
  14. // writable: true
  15. // };
  16. }

可以看出,方法的装饰器接受三个参数:类的原型对象、方法名、描述对象。
方法的装饰器可以用下面的代码来实现。

  1. let descriptor = {
  2. value: function say() {},
  3. enumerable: false,
  4. configurable: true,
  5. writable: true
  6. };
  7. descriptor = readonly(A.prototype, 'say', descriptor) || descriptor;
  8. Object.defineProperty(A.prototype, 'say', descriptor);

目前,装饰器模式并没有被支持,所以暂时先这样。