概述
面向对象的概念(java:注解;C#:特征),decorator angular大量使用,react也有用到。node inversify框架中也大量使用 目前JS支持装饰器,目前除以建议征集的第二阶段
解决的问题
- 信息书写位置的问题
- 重复代码的问题
上述两个问题产生的根源:某些信息,在定义时,能够附加的信息量有限。
装饰器,能够带来额外的信息量,可以达到分离关注点的目的。
装饰器的作用:为某些属性、类、参数、方法提供元数据信息(metadata)
元数据:描述数据的数据
装饰器的本质
在JS中,装饰器是一个函数。(装饰器是要参与运行的)
装饰器可以修饰:
- 类
- 成员(属性和方法)
- 参数
类装饰器
类装饰器的本质是一个函数,该函数接受一个参数,表示类本身(构造函数本身)
使用装饰器@得到一个函数。
在TS中,如何约束一个变量为类:
- Function
new (参数)=>object,推荐
在TS中要使用装饰器,需要开启experimentalDecorators。
装饰器函数的运行时间:在类定义之后直接调用。
类装饰器可以具有的返回值:
- void 仅运行函数
- 返回一个新的类:会将新的类替换掉装饰目标
多装饰器的情况:会按照后加入先调用的顺序进行调用。
成员装饰器
属性
属性装饰器也是一个函数,该函数需要两个参数:
- 如果是静态属性,则为类本身,如果是实例属性,则为类的原型;
- 固定为一个字符串,表示属性名
function d(target:any,key:string){}
方法
方法装饰器也是一个函数,该函数需要三个参数:
- 如果是静态属性,则为类本身,如果是实例属性,则为类的原型;
- 固定为一个字符串,表示方法名
- 描述符对象
function d(target:any,key:string,descriptor:PropertyDescriptor){}
无论属性还是方法,都可以通过多个装饰器来修饰。
工具库
- reflect-metadata
- class-validator
- class-transformer
补充
参数装饰器
依赖注入,控制反转
要求参数函数有三个参数:
- 如果方法是静态的,则为类本身;如果方法是实例方法,则为类的原型。
- 方法名称
- 在参数列表中的索引
function test(target:any,method:string,index:number){console.log(target,method,index)}
关于TS自动注入的元数据
如果安装了reflect-metadata,并且导入了该库,并且在某个成员上添加了元数据,并且启用了emitDecoratorMetadata。则在编译结果中会将约束的类型,作为元数据加入到相应位置。
这样一来,TS的类型检查将有机会在运行时进行。
AOP
面向切面编程,属于面向对象开发。
将一些在业务中共同出现的功能块,横向切分,以达到分离关注点的目的。
