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

(0)

相关推荐

  • 前端设计模式总结

    菜鸟看书的一点总结,请大佬给出宝贵意见 创建型 工厂模式 创建对象的工厂,使用者不必关心对象生成的过程,也就是不需要显示的调用new 操作符,只需要调用对象工厂暴露出来的创建对象的方法,并传入需要创建 ...

  • python笔记63 - __get__ 描述器(descriptor)学习

    前言 描述器定义 描述器是一个类的类属性是另一个类的实例,另一个类中实现了__set__.__delete__和__get__方法之一. 如有两个类A,B,类A中实现__set__.__delete_ ...

  • Javascript装饰器原理

    一个以@开头的描述性词语.英语的decorator动词是decorate,装饰的意思.其中词根dek(dec发音)原始印欧语系中意思是"接受".即,原来的某个事物接受一些新东西(而 ...

  • 使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener

    官网链接 语法 type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void; target:直 ...

  • TypeScript 类装饰器的一个例子和使用单步调试搞清楚其运行原理

    官方文档 类装饰器的定义如下: type ClassDecorator = <TFunction extends Function> (target: TFunction) => T ...

  • TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子

    reflect-metadata 例子: import 'reflect-metadata'; function validate( target: Object, key: string, desc ...

  • Python 中的函数装饰器和闭包

    函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另一个函数,称为被装饰函数.装饰器可以修改这个函数再将其返回, ...

  • Selenium2+python自动化55-unittest之装饰器(@classmethod)

    前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...

  • 设计模式-装饰器模式

    装饰器模式 定义 装饰器模式也叫包装模式 在不改变原有对象的基础上,把功能附加到对象上,提供了比继承更有弹性的替代方案 能够扩展原有对象的功能 属于结构型模式 生活中的例子 买煎饼 我们煎饼可以加鸡蛋 ...

  • PHP设计模式之装饰器模式

    PHP设计模式之装饰器模式 工厂模式告一段落,我们来研究其他一些模式.不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟.其实,今天的装饰器模式就和化妆这件事很像.相信如果有程序媛MM在的话,马 ...

  • [PHP小课堂]PHP设计模式之装饰器模式

    [PHP小课堂]PHP设计模式之装饰器模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 3年工作必备 装饰器模式

    回复"000"获取大量电子书 大家好,我是老田,从今天开始,本公众号每周给大家送福利,送什么呢?肯定是技术书啦,没那么多花里胡哨的,参与方式见文末. 好啦,进入我们的主题,今天我给 ...