1. 装饰器就是一个方法, 可以注入到类/方法/属性/参数上来扩展其功能
2. 类装饰器 (普通装饰器)
// 声明装饰器, clazz会接收到使用这个装饰器的类
function fnDemo(clazz: any) {
// 扩展属性
clazz.prototype.value = '扩展属性';
// 扩展方法
clazz.prototype.run = function() {
console.log('扩展方法');
}
}
// 使用装饰器, 在类上直接加
@fnDemo()
class Demo {
}
var demo: any = new Demo();
console.log(demo.value);
demo.run();
3. 类装饰器 (装饰器工厂, 可传参)
function fnDemo(value: string) {
return function (clazz: any) {
clazz.prototype.value = value;
clazz.prototype.run = function() {
console.log('扩展方法');
}
}
}
@fnDemo('hello')
class Demo {
}
var demo: any = new Demo();
console.log(demo.value);
demo.run();
4. 属性装饰器
function fnDemo(value: string) {
// clazz: 类原型对象
// attr: 属性名
return function (clazz: any, attr: any) {
clazz[attr] = value;
}
}
class Demo {
@fnDemo('hello')
value: string | undefined;
}
var demo: any = new Demo();
console.log(demo.value);
5. 方法装饰器
function fnDemo(value: string) {
// clazz: 类原型对象
// methodName: 方法名
// desc: 方法描述
return function (clazz: any, methodName: any, desc: any) {
// ...
}
}
5. 方法参数装饰器
function fnDemo(value: string) {
// clazz: 类原型对象
// methodName: 方法名
// paramsIndex: 参数的索引位置(从0开始)
return function (clazz: any, methodName: any, paramsIndex: any) {
// ...
}
}
6. 装饰器的执行顺序
属性装饰器 -> 方法装饰器 -> 方法参数装饰器2 -> 方法参数装饰器1 -> 类装饰器2 -> 类装饰器1
注: 装饰器可以写多个, 如果有多个装饰器, 会先执行后面的