You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为外部包中的已有类A应用自定义属性装饰器test?

如何在外部类上应用自定义属性装饰器

你不需要所谓的“反射对象”来调用装饰器,属性装饰器的第一个参数target对应两种场景:

  • 装饰实例属性时,target是类的原型对象(即A.prototype)
  • 装饰静态属性时,target是类的构造函数本身(即A)

针对你的场景,类A的mess是实例属性,可按以下步骤手动调用装饰器:

  1. 先获取mess属性的属性描述符
  2. 直接调用装饰器并传入正确的参数
  3. 若装饰器修改了描述符,重新定义属性(确保修改生效)

具体代码如下:

// 获取实例属性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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:18:22