写一个简单的记录函数执行时间的装饰器

1,340 阅读1分钟

目标

实现一个装饰器

要点

  • 什么是装饰器
  • 装饰器如何使用
  • 实现一个简单的装饰器

装饰器

  1. 装饰器是一种特殊类型的声明,本质上就是一个方法,可以注入到类、方法、属性、参数上,扩展其功能;

  2. 常见的装饰器:类装饰器、属性装饰器、方法装饰器、参数装饰器...

  3. 装饰器在写法上有:普通装饰器(无法传参)、装饰器工厂(可传参)

  4. 装饰器已是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 {}