推荐答案
// www.javascriptcn.com code example
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling method: ${propertyKey} with arguments: ${JSON.stringify(args)}`);
const result = originalMethod.apply(this, args);
console.log(`Method: ${propertyKey} returned: ${JSON.stringify(result)}`);
return result;
};
return descriptor;
}
class MyClass {
@logMethod
myMethod(arg1: string, arg2: number) {
return `Received: ${arg1} and ${arg2}`;
}
}
const instance = new MyClass();
instance.myMethod("Hello", 42);本题详细解读
1. 装饰器基础
装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问器、属性或参数上。装饰器使用 @expression 的形式,其中 expression 必须是一个函数,它会在运行时被调用,被装饰的声明信息作为参数传入。
2. 方法装饰器
方法装饰器可以应用于类的方法上。它接收三个参数:
target: 对于静态成员来说是类的构造函数,对于实例成员来说是类的原型。propertyKey: 方法的名称。descriptor: 方法的属性描述符。
3. 自定义装饰器实现
在上面的例子中,我们定义了一个名为 logMethod 的装饰器。这个装饰器的作用是在调用被装饰的方法时,打印出方法的名称、传入的参数以及方法的返回值。
4. 装饰器的应用
我们将 logMethod 装饰器应用到了 MyClass 类的 myMethod 方法上。当 myMethod 被调用时,装饰器会自动执行,打印出相关的日志信息。
5. 运行结果
当我们创建一个 MyClass 的实例并调用 myMethod 方法时,控制台会输出如下内容:
Calling method: myMethod with arguments: ["Hello",42] Method: myMethod returned: "Received: Hello and 42"
这个例子展示了如何通过自定义装饰器来增强方法的功能,而不需要修改方法本身的代码。