打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用 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 方法时,这个新版本就得以执行了:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
一文读懂 JS 装饰器,这是一个会打扮的装饰器
JavaScript中的装饰器
设计模式——装饰模式(Decorator)
Javascript装饰器原理
Python高级编程技巧
C#面向对象设计模式纵横谈:Decorator 装饰模式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服