概述

面向对象的概念(java:注解;C#:特征),decorator angular大量使用,react也有用到。node inversify框架中也大量使用 目前JS支持装饰器,目前除以建议征集的第二阶段

解决的问题

  • 信息书写位置的问题
  • 重复代码的问题

上述两个问题产生的根源:某些信息,在定义时,能够附加的信息量有限。

装饰器,能够带来额外的信息量,可以达到分离关注点的目的。

装饰器的作用:为某些属性、类、参数、方法提供元数据信息(metadata)

元数据:描述数据的数据

装饰器的本质

在JS中,装饰器是一个函数。(装饰器是要参与运行的)

装饰器可以修饰:

  • 成员(属性和方法)
  • 参数

类装饰器

类装饰器的本质是一个函数,该函数接受一个参数,表示类本身(构造函数本身)

使用装饰器@得到一个函数

在TS中,如何约束一个变量为类:

  • Function
  • new (参数)=>object,推荐

在TS中要使用装饰器,需要开启experimentalDecorators

装饰器函数的运行时间:在类定义之后直接调用

类装饰器可以具有的返回值:

  • void 仅运行函数
  • 返回一个新的类:会将新的类替换掉装饰目标

多装饰器的情况:会按照后加入先调用的顺序进行调用。

成员装饰器

属性

属性装饰器也是一个函数,该函数需要两个参数:

  1. 如果是静态属性,则为类本身,如果是实例属性,则为类的原型;
  2. 固定为一个字符串,表示属性名
  1. function d(target:any,key:string){}

方法

方法装饰器也是一个函数,该函数需要三个参数:

  1. 如果是静态属性,则为类本身,如果是实例属性,则为类的原型;
  2. 固定为一个字符串,表示方法名
  3. 描述符对象
  1. function d(target:any,key:string,descriptor:PropertyDescriptor){}

无论属性还是方法,都可以通过多个装饰器来修饰。

工具库

  1. reflect-metadata
  2. class-validator
  3. class-transformer

补充

参数装饰器

依赖注入,控制反转

要求参数函数有三个参数:

  1. 如果方法是静态的,则为类本身;如果方法是实例方法,则为类的原型。
  2. 方法名称
  3. 在参数列表中的索引
  1. function test(target:any,method:string,index:number){
  2. console.log(target,method,index)
  3. }

关于TS自动注入的元数据

如果安装了reflect-metadata,并且导入了该库,并且在某个成员上添加了元数据,并且启用了emitDecoratorMetadata。则在编译结果中会将约束的类型,作为元数据加入到相应位置。

这样一来,TS的类型检查将有机会在运行时进行。

AOP

面向切面编程,属于面向对象开发。

将一些在业务中共同出现的功能块,横向切分,以达到分离关注点的目的。