我知道原型对象上的数据属性被认为是反模式,但有一些用例。第一个是 @@toStringTag 属性,
Object.prototype.toString()
使用它来返回“[object Foo]”而不是“[object Object]”。将该属性放在 Foo.prototype
上似乎是正确的做法。
但是 - 如何以正确的方式做到这一点?我可以
get[Symbol.toStringTag]() { return "Foo"; }
(用于 MDN)我不喜欢这三个选项,因为
class
语法非常努力地隐藏原型对象。前两个变体消除了这一点。第三个没有,但它创建了一个不必要的功能。
声明属性
[Symbol.toStringTag] = "Foo";
是我想要避免的,因为它会在 Foo
的每个实例上创建该属性,而不是在原型上。
也许我太执着于以正确的方式编写代码。但在我向 TC39 发送请求之前 - 有什么我错过的吗?有
class
声明原型属性的语法吗?
正如你所说,
class
语法努力隐藏原型对象,并且它已经实现了这一点,以至于不可能在不明确提及的情况下将数据属性放置在原型对象上。你没有错过任何东西。