推荐答案
// www.javascriptcn.com code example
function performanceMonitor(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
const start = performance.now();
const result = originalMethod.apply(this, args);
const end = performance.now();
console.log(`Method ${propertyKey} took ${end - start} milliseconds.`);
return result;
};
return descriptor;
}
class MyClass {
@performanceMonitor
myMethod() {
// 模拟一个耗时操作
for (let i = 0; i < 1000000000; i++) {}
}
}
const instance = new MyClass();
instance.myMethod(); // 输出: Method myMethod took X milliseconds.本题详细解读
装饰器基础
装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问器、属性或参数上。装饰器使用 @expression 的形式,其中 expression 必须是一个函数,它会在运行时被调用,被装饰的声明信息作为参数传入。
性能监控装饰器的实现
装饰器函数定义:
performanceMonitor是一个方法装饰器,它接收三个参数:target:对于静态成员来说是类的构造函数,对于实例成员来说是类的原型。propertyKey:被装饰的方法的名称。descriptor:被装饰方法的属性描述符。
保存原始方法:在装饰器内部,首先保存原始方法的引用
originalMethod。重写方法:通过修改
descriptor.value,将原始方法替换为一个新的函数。这个新函数在执行原始方法之前记录开始时间,执行之后记录结束时间,并计算并输出执行时间。返回描述符:最后返回修改后的
descriptor,以便 TypeScript 能够正确地应用这个装饰器。
使用示例
在 MyClass 类中,myMethod 方法被 @performanceMonitor 装饰器修饰。当调用 myMethod 时,装饰器会自动记录并输出该方法的执行时间。
注意事项
- 装饰器目前是 TypeScript 的实验性功能,需要在
tsconfig.json中启用experimentalDecorators选项。 - 装饰器可以用于多种场景,如日志记录、性能监控、权限控制等,灵活使用可以大大增强代码的可维护性和可扩展性。