装饰器主要用于面向切面编程,它是一个函数,可以装饰类、方法、属性、参数和访问器,在不修改源代码的基础上,包装一层自定义的操作,给已有代码增加额外的行为,主要用于面向切面编程;
面向切面编程(AOP):将一些与核心的业务代码无关的功能抽离出来,然后通过“动态编织”的方式注入到业务代码中,可以提高业务代码的整洁和内聚性,也能复用抽离出的功能模块; 运行时,动态将行为切入到指定代码、指定位置的编程思想就是面向切面编程,可以解耦。举例:当两个类需要都需要一个日志的方法,面向对象编程的思想会创建一个日志的类,在两个函数中调用,这样就会产生耦合,而面向切面编程是为了解耦; 具体什么是AOP,AOP与OOP的区别和AOP的概念?请看 https://www.jianshu.com/p/f1770b9dce27
方法装饰器
方法装饰器有三个参数:
- target——当前对象
- property——方法名称
- descriptor——属性描述符
由于装饰器还在提案阶段,需要用babel或者tslint编译才能使用;安装bebel和babel装饰器提案;
"scripts": {"parse":"npx babel source.js --out-file target.js && prettier --write target.js",},
类装饰器
类装饰器可以对构造函数(对于静态成员来说是类的构造函数,对于实例成员是类的原型对象)进行监听、修改和重载;
一个参数:
- constructor 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象;
```typescript
function classDecorator
(constructor:T) { return class extends constructor {
} }newProperty = "new property";hello = "override";
@classDecorator class Greeter { property = “property”; hello: string; constructor(m: string) { this.hello = m; } }
console.log(new Greeter(“world”)); ```
属性装饰器
属性装饰器表达式会在运行时当作函数被调用,传入下列2个参数:
- 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
-
参数装饰器
参数装饰器声明在一个参数声明之前(紧靠着参数声明)。 参数装饰器应用于类构造函数或方法声明。 参数装饰器不能用在声明文件(.d.ts),重载或其它外部上下文(比如
declare的类)里。
参数装饰器表达式会在运行时当作函数被调用,传入下列3个参数: 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
- 成员的名字。
- 参数在函数参数列表中的索引。
注意 参数装饰器只能用来监视一个方法的参数是否被传入。
访问符装饰器
访问器装饰器声明在一个访问器的声明之前(紧靠着访问器声明)。 访问器装饰器应用于访问器的 属性描述符并且可以用来监视,修改或替换一个访问器的定义。 访问器装饰器不能用在声明文件中(.d.ts),或者任何外部上下文(比如 declare的类)里。
注意 TypeScript不允许同时装饰一个成员的
get和set访问器。取而代之的是,一个成员的所有装饰的必须应用在文档顺序的第一个访问器上。这是因为,在装饰器应用于一个属性描述符时,它联合了get和set访问器,而不是分开声明的。
访问器装饰器表达式会在运行时当作函数被调用,传入下列3个参数:
- 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
- 成员的名字。
- 成员的属性描述符。
