关于typescript:使用-TypeScript-自定义装饰器给类的方法增添监听器-Listener

办法装璜器

语法

type MethodDecorator = <T>(
  target: Object,
  propertyKey: string | symbol,
  descriptor: TypedPropertyDescriptor<T>
) => TypedPropertyDescriptor<T> | void;

(1)target: 对于动态成员来说是类的结构器,对于实例成员来说是类的原型链。
(2)propertyKey: 属性的名称。
(3)descriptor: 属性的形容器。

办法装璜器不同于属性装璜器的中央在于descriptor参数。 通过这个参数咱们能够批改办法本来的实现,增加一些共用逻辑。 例如咱们能够给一些办法增加打印输出与输入的能力:

function logger(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const original = descriptor.value;

  descriptor.value = function (...args) {
    console.log('params: ', ...args);
    const result = original.call(this, ...args);
    console.log('result: ', result);
    return result;
  }
}

class C {
  @logger
  add(x: number, y:number ) {
    return x + y;
  }
}

const c = new C();
c.add(1, 2);
// -> params: 1, 2
// -> result: 3

下面的例子,很像 Java 里的 AOP – Aspect Oriented Programming, 面向切片编程。

运行时,咱们装璜器施加的 target:

key 是被润饰的 add 办法的字符串名称:

descriptor 的 value 属性指向了 add 办法的原始实现:

…arg 代表任意数量的参数:

第 57 行的 Object.defineProperty, 将类的 add 办法批改成蕴含了 log 性能的新版本:

这样,稍后咱们调用 add 办法时,这个新版本就得以执行了:

更多Jerry的原创文章,尽在:”汪子熙”:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理