如何为外部包中的已有类A应用自定义属性装饰器test?
如何在外部类上应用自定义属性装饰器
你不需要所谓的“反射对象”来调用装饰器,属性装饰器的第一个参数target对应两种场景:
- 装饰实例属性时,
target是类的原型对象(即A.prototype) - 装饰静态属性时,
target是类的构造函数本身(即A)
针对你的场景,类A的mess是实例属性,可按以下步骤手动调用装饰器:
- 先获取
mess属性的属性描述符 - 直接调用装饰器并传入正确的参数
- 若装饰器修改了描述符,重新定义属性(确保修改生效)
具体代码如下:
// 获取实例属性mess的描述符 const messDescriptor = Object.getOwnPropertyDescriptor(A.prototype, 'mess'); // 手动调用装饰器 test(A.prototype, 'mess', messDescriptor); // 若装饰器修改了描述符,重新绑定属性 if (messDescriptor) { Object.defineProperty(A.prototype, 'mess', messDescriptor); }
注意事项
- 你的原装饰器代码存在逻辑错误:
target.propertyKey = 'test';会给target添加一个名为propertyKey的属性,而非传入的目标属性名。修正后的装饰器应为:
function test(target: any, propertyKey: string, descriptor: PropertyDescriptor) { target[propertyKey] = 'test'; };
- 如果要装饰类的静态属性,只需将
target换成类本身A,并对应获取静态属性的描述符即可:
// 假设A有静态属性staticMess const staticDescriptor = Object.getOwnPropertyDescriptor(A, 'staticMess'); test(A, 'staticMess', staticDescriptor); if (staticDescriptor) { Object.defineProperty(A, 'staticMess', staticDescriptor); }
内容的提问来源于stack exchange,提问作者W.W
相关产品推荐
相关产品推荐

