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

为何TypeScript类装饰器中target.constructor.name失效,方法装饰器正常?

类装饰器与方法装饰器中target.constructor.name结果差异的原因

核心原因是类装饰器和方法装饰器接收的target参数指向的对象完全不同,具体差异如下:

1. 类装饰器的target指向类的构造函数

类装饰器直接作用于类本身,此时的target就是类的构造函数(也就是示例中的MyClass函数对象)。在JavaScript中,所有函数的构造函数都是Function,所以target.constructor指向的是Function构造函数,它的name属性自然是"Function"。

如果想在类装饰器中获取类名,直接访问target.name即可,因为构造函数自身的name属性就是类名:

function myClassDecorator(target: any) {
  console.log(target.name); // 输出 "MyClass"
}

2. 方法装饰器的target指向类的原型对象

当装饰实例方法时,方法装饰器的target参数是类的原型对象(MyClass.prototype)。原型对象的constructor属性默认指向类的构造函数MyClass,所以target.constructor.name会返回类的名称"MyClass"。

示例验证

把两个装饰器的target内容打印出来,就能直观看到差异:

function myClassDecorator(target: any) {
  console.log("类装饰器target:", target); // 输出 MyClass 构造函数本身
  console.log("类装饰器target.constructor:", target.constructor); // 输出 Function 构造函数
}

function myMethodDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  console.log("方法装饰器target:", target); // 输出 MyClass.prototype 对象
  console.log("方法装饰器target.constructor:", target.constructor); // 输出 MyClass 构造函数
}

内容的提问来源于stack exchange,提问作者97amarnathk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:01:36