// 定义装饰器
function logCallCount(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
let callCount = 0;
descriptor.value = function(...args: any[]) {
callCount++;
const callTime = new Date();
console.log(`Method ${propertyKey} called at ${callTime.toISOString()}, call count: ${callCount}`);
return originalMethod.apply(this, args);
};
return descriptor;
}
// 使用装饰器的类
class MyClass {
@logCallCount
myMethod() {
console.log('Inside myMethod');
}
}
// 测试
const myObj = new MyClass();
myObj.myMethod();
myObj.myMethod();
装饰器工作原理解释
- 定义装饰器函数:
logCallCount
是一个装饰器函数,它接收三个参数 target
(类的原型对象),propertyKey
(方法名),descriptor
(包含方法的属性描述符)。
- 保存原始方法:
const originalMethod = descriptor.value;
保存原始的方法,以便之后调用。
- 定义新的方法:
descriptor.value
被重新赋值为一个新的函数。在这个新函数中,首先增加调用次数 callCount
,然后记录调用时间 callTime
,并将调用信息打印到控制台。最后,通过 originalMethod.apply(this, args)
调用原始方法,并返回其执行结果。
- 返回修改后的描述符:返回修改后的
descriptor
,这样类的方法就被替换为新的带有调用记录功能的方法。
- 使用装饰器:在
MyClass
类的 myMethod
方法上使用 @logCallCount
装饰器,这样当 myMethod
方法被调用时,装饰器就会生效。每次调用 myMethod
都会记录调用次数和调用时间并打印到控制台。