为何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
相关产品推荐
相关产品推荐

