面试题答案
一键面试target
参数:- 含义:对于静态方法,它是类的构造函数;对于实例方法,它是类的原型对象。
- 实际应用:比如可以通过判断
target
是构造函数还是原型对象,来决定是否为静态方法或实例方法添加扩展逻辑。例如,记录方法调用的日志,若target
是构造函数,说明是静态方法调用,可在日志中标记为静态方法相关日志。
propertyKey
参数:- 含义:被装饰方法的名称。
- 实际应用:可根据方法名实现不同的扩展逻辑。例如,对特定名称的方法进行权限验证,如只有名为
adminOnlyMethod
的方法需要进行管理员权限验证。
descriptor
参数:- 含义:包含被装饰方法的属性描述符,如
value
(方法的实际函数体)、writable
(是否可写)、enumerable
(是否可枚举)、configurable
(是否可配置)等属性。 - 实际应用:可以通过修改
descriptor
的属性来扩展方法功能。比如,在不改变原方法逻辑的情况下,通过修改value
属性,在原方法前后添加额外逻辑,如在方法执行前检查参数合法性,在方法执行后记录执行时间。示例代码如下:
- 含义:包含被装饰方法的属性描述符,如
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();
在上述代码中,通过descriptor.value
修改了原方法,在其前后添加了日志记录功能。