面试题答案
一键面试原理
TypeScript装饰器本质上是一个函数,它可以在类定义、属性、方法或参数定义阶段对其进行修改或增强。当装饰器应用在类方法上时,它会在运行时被调用,传入目标类的原型对象、方法名以及一个描述符对象。通过操作这个描述符对象,可以修改方法的行为,比如重写方法的执行逻辑。
代码示例
// 定义一个装饰器函数
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`调用方法 ${propertyKey} 前`);
const result = originalMethod.apply(this, args);
console.log(`调用方法 ${propertyKey} 后`);
return result;
};
return descriptor;
}
class MyClass {
@logMethod
myMethod() {
console.log('执行 myMethod');
}
}
const myObj = new MyClass();
myObj.myMethod();
在上述代码中,logMethod
是一个装饰器函数,它接收目标类的原型对象 target
、方法名 propertyKey
和描述符对象 descriptor
。在装饰器函数内部,保存了原始方法 originalMethod
,然后重写了 descriptor.value
,在调用原始方法前后添加了日志输出。在 MyClass
类中,myMethod
方法应用了 logMethod
装饰器,这样每次调用 myMethod
时,都会在方法执行前后输出日志。