JavaScript 类定义中是否有语法可以在原型上声明属性?

问题描述 投票:0回答:1

我知道原型对象上的数据属性被认为是反模式,但有一些用例。第一个是 @@toStringTag 属性,

Object.prototype.toString()
使用它来返回“[object Foo]”而不是“[object Object]”。将该属性放在
Foo.prototype
上似乎是正确的做法。

但是 - 如何以正确的方式做到这一点?我可以

  • 创建一个静态初始化程序,在原型上调用 Object.defineProperty (或只是分配它)
  • 在类声明之后调用原型上的defineProperty
  • 定义这样的 getter:
    get[Symbol.toStringTag]() { return "Foo"; }
    (用于 MDN)

我不喜欢这三个选项,因为

class
语法非常努力地隐藏原型对象。前两个变体消除了这一点。第三个没有,但它创建了一个不必要的功能。

声明属性

[Symbol.toStringTag] = "Foo";
是我想要避免的,因为它会在
Foo
的每个实例上创建该属性,而不是在原型上。

也许我太执着于以正确的方式编写代码。但在我向 TC39 发送请求之前 - 有什么我错过的吗?有

class
声明原型属性的语法吗?

javascript class properties prototype
1个回答
0
投票

正如你所说,

class
语法努力隐藏原型对象,并且它已经实现了这一点,以至于不可能在不明确提及的情况下将数据属性放置在原型对象上。你没有错过任何东西。
正如您提到的,这通常是一种反模式,因此语法不鼓励它,我怀疑添加它的提案是否会被 TC39 很好地接受。

© www.soinside.com 2019 - 2024. All rights reserved.