JS 语义:为啥私有和公共类属性似乎重新排序?
Posted
技术标签:
【中文标题】JS 语义:为啥私有和公共类属性似乎重新排序?【英文标题】:JS semantics: Why do private and public class properties seem to get reordered?JS 语义:为什么私有和公共类属性似乎重新排序? 【发布时间】:2021-09-11 14:54:25 【问题描述】:下面的屏幕截图显示了new A()
的值,但它的属性已重新排序。
这有什么好的理由吗?
代码
class A
constructor()
#private1 = 1;
public1 = 11;
#private2 = 2;
public2 = 22;
new A();
结果:
【问题讨论】:
依赖特定的属性排序总是一个坏主意。那么,为什么您发现这比给定订单的实际预期更令人担忧? 是this.#privateX
不是this.privateX
... 后者是 undefined
。
@Domi 执行顺序是class
中初始化器定义的顺序,但是控制台中对象的显示是无序的。 (即使属性是有序的,私有字段也不属于该顺序)。
@Domi 但这不是问题所在,不是吗? “问题:在以下代码示例中,this.privateX
未定义”似乎是您问题的核心部分。如果不是,请edit 删除错字并专注于实际问题。
@Bergi 现已修复。
【参考方案1】:
私有成员不是普通属性(用字符串或符号作为键),它们不共享可以任意穿插的顺序。
事实上,私有成员是不可枚举的,所以你永远不能以任何的顺序列出它们。只是没有 JS 功能可以做到这一点。
开发工具(使用调试器 API 访问对象)显然选择首先列出对象的属性,然后按定义的顺序列出对象的私有字段。请注意,这可能随时发生变化,您不应认为它具有任何意义。
【讨论】:
非常期待看到最终允许枚举私有成员 (as discussed here) 的规范发生变化。 @Domi Private 成员在设计上不能动态访问。他们没有任何反映,因为他们真的是私人的。 JS 不像 C# 那样工作。如果你真的需要循环,循环[o => o.#private1, o => o.#private2]
。
可悲的是,这不是“循环”,而且,您的意思是this
而不是o
,不是吗? (我认为,o.#private1
不是有效的语法?)您在另一个线程中指出eval
可以做到,但这仍然需要所有可能变量的列表。现在,在没有babel
等人的情况下提取该信息的唯一方法似乎是正则表达式MyClass.toString
,但这当然很容易出错......
@Domi 那就不要使用私有字段。以上是关于JS 语义:为啥私有和公共类属性似乎重新排序?的主要内容,如果未能解决你的问题,请参考以下文章