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 语义:为啥私有和公共类属性似乎重新排序?的主要内容,如果未能解决你的问题,请参考以下文章

子类将继承父类所有的方法和属性吗?为啥?

为啥公共领域比属性快?

当我在 IRB 中声明时,为啥我的***方法在所有类上都是公共的(而不是私有的)?

为啥同一类而不是同一对象可以访问受保护和私有属性?

是否可以在私有方法中定义公共变量?

我应该使用公共属性和私有字段还是公共字段来存储数据?