目标
实现一个装饰器
要点
- 什么是装饰器
- 装饰器如何使用
- 实现一个简单的装饰器
装饰器
-
装饰器是一种特殊类型的声明,本质上就是一个方法,可以注入到类、方法、属性、参数上,扩展其功能;
-
常见的装饰器:类装饰器、属性装饰器、方法装饰器、参数装饰器...
-
装饰器在写法上有:普通装饰器(无法传参)、装饰器工厂(可传参)
-
装饰器已是ES7的标准特性之一!
如何使用
无参数的
function Path(target:any) {
console.log("I am decorator.")
}
@Path
class RouterService {}
使用tsc编译后,执行命令node xxx.js,输出结果如下:
I am decorator.
有参数的
function Path(p1: string, p2: string) {
return function (target) { // 这才是真正装饰器
// do something
}
}
@Path("/user", "userId")
class RouterService {}
实现一个简单的装饰器
export function measure(target: any, name: any, descriptor: any) {
const oldValue = descriptor.value;
descriptor.value = async function() {
const start = Date.now();
const ret = await oldValue.apply(this, arguments);
console.log(`${name}执行耗时 ${Date.now() - start}ms`);
return ret;
};
return descriptor;
}
@measure
// 会记录函数的执行耗时🕓🕝🕤
class RouterService {}