关于ts类的装饰器的参数的疑问?

看中文文档的时候有一句话:类装饰器表达式会在运行时当作函数被调用,类的构造函数作为其唯一的参数。
但是下面的例子中,我打印的参数为什么等于类。所以我认为类的装饰器参数不应该是类本身吗?为什么说是类的构造函数

function testDecorator(target: any) {
    console.log(target, target === Test) // 输出 [class Test] true
}

@testDecorator
class Test {
    name: string;
    constructor(name: string) {
        this.name =name
    }
}
new Test('')

类本身类构造函数是一个东西吗?

阅读 1.4k
2 个回答

跟装饰器无关,ES6 class 的构造函数本来就等于 class 自身……

class Test {
  constructor() {
  }
}

console.log(new Test().constructor === Test); // true

别被 class 迷惑了,它跟其他真正的 OOP 编程语言不一样,JS 里实质就是个语法糖,其实还是 function。上面代码就等于:

function Test() {
  if (!new.target) throw 'must be called with new';
}

console.log(new Test().constructor === Test); // true

这个 function Test 跟上面的 class Test 里的 constructor 是一回事儿。

你要是有过 Java/C# 之类 OOP 语言的经验,可能会被绕进去,因为这些编程语言里类就是类、构造器就是构造器,确实不一样。

首先,我们来解释一下给定的代码。这里有一个类装饰器testDecorator,它接收一个参数target。然后有一个用@testDecorator装饰的类Test

从给定的代码中,我们可以看到testDecorator的参数是类Test本身。当我们运行代码时,输出结果为[class Test]true,说明target参数确实等于类 Test

在这里,文档的说法可能有些误导。实际上,类装饰器的参数应该是类本身,而不是类的构造函数。当然,这两者有关联,因为类的构造函数是类的一个重要组成部分。但是,类装饰器的参数是类本身。

在 JavaScript 和 TypeScript 中,类本身与类的构造函数不完全相同。类本身是一个包含构造函数、原型和静态方法的对象。在这个例子中,类装饰器的参数确实是类本身,而不仅仅是构造函数。所以,你的理解是正确的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏