ES中的装饰器至今还没有定案,TS中的也是实验中的功能,需要在配置文件中开启
装饰器是一种特殊的声明,能附加到类的声明、成员、方法参数上,修改它们的行为及扩展功能

声明装饰器

  1. function decorator (target:any) {}
  2. @decorator
  • 通过 @decorator 声明装饰器,装饰器就是一个函数
    • @ 后面可以是函数名;也可以是一个表达式,但最终结果必须是一个函数
  • 使用的函数会在运行时被调用,被装饰的声明信息会作为参数传入
  • 声明时要紧挨着装饰的目标

装饰器工厂

用于为装饰器添加动态行为,提高代码复用性

  1. function decorator ( params:number ) {
  2. return function ( target: any ) {}
  3. }
  4. @decorator('123')
  • 装饰器工厂也是一个函数,但是它需要再返回一个函数
  • 使用方式:需要在 @ 后面调用,返回的函数就会作为装饰器使用

装饰器组合

一个目标可以同时声明多个装饰器

  1. @decorator1
  2. @decorator2(123)
  3. target

装饰器分类

  1. 类装饰器
  2. 属性装饰器
  3. 方法装饰器
  4. 参数装饰器
  5. 访问修饰符装饰器

装饰器执行顺序

  1. 先从前往后调用装饰器工厂,得到函数声明装饰器
  2. 再从后往前调用装饰器
  3. 属性装饰器 / 访问修饰符装饰器 > 方法装饰器 > 参数装饰器 > 类装饰器

不同声明上的装饰器调用顺序不同

  1. 实例成员/实例成员
    • 参数装饰器 > 方法装饰器 > 访问修饰符装饰器 > 属性装饰器
  2. 构造函数
    1. 参数装饰器