Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何枚举私有JavaScript类字段_Javascript_Javascript Objects_Private_Class Fields - Fatal编程技术网

如何枚举私有JavaScript类字段

如何枚举私有JavaScript类字段,javascript,javascript-objects,private,class-fields,Javascript,Javascript Objects,Private,Class Fields,如何通过私有类字段进行枚举 class Person { #isFoo = true; #isBar = false; constructor(first, last) { this.firstName = first; this.lastName = last; } enumerateSelf() { console.log(this); // (pub/priv fields shown) // enumerate throu

如何通过私有类字段进行枚举

class Person {
  #isFoo = true;
  #isBar = false;

  constructor(first, last) {
    this.firstName = first;
    this.lastName = last;
  }

  enumerateSelf() {
    console.log(this);
    // (pub/priv fields shown)

    // enumerate through instance fields
    for (let key in this) {
      console.log(key)
      // (only public fields shown)
    }

    // How do we enumerate/loop through private fields too?
  }
}

new Person('J', 'Doe').enumerateSelf();

这是不可能的。它们是私有字段,没有枚举方法。只有类声明静态地知道声明了哪些类。它们不是属性,甚至没有表示私有名称的语言值,比如你(用括号表示)

你能得到的最好的是

enumerateSelf() {
    console.log(this);
    for (let key in this) {
        console.log("public", key, this[key]);
    }
    console.log("private isFoo", this.#isFoo);
    console.log("private isBar", this.#isBar);
}

private fields提案中有关于“private field iteration”的内容,但是TC39成员国的第一条评论之一是“private fields不是属性。你不能通过设计来反映它们。”。

也许不是一个优雅的解决方案,但也许你可以修改你的结构,比如:

class Person {
  #properties = {
      isFoo: true,
      isBar: false
  };

  constructor(first, last) {
    this.firstName = first;
    this.lastName = last;
  }

  enumeratePrivateSelf() {
    // enumerate through private fields
    for (let key in this.#properties) {
      console.log(key)
      // (only public fields shown)
    }
  }
}

我认为使用
Object.getOwnPropertyDescriptors将有所帮助,但我很少使用私有属性。上次我查看它们时,它们还没有最终确定。根据定义,私有字段在静态方法调用(如
Object.*
对象)的实例之外是不可访问的。我猜您可能还有另一个私有字段列出了所有其他私有字段,因此您可以循环使用它们。但是这会很烦人,因为你需要手动更新它。希望只是暂时的,让我回顾一下ECMA规范,并可能提出修改建议。@AnthumChris这不太可能会改变。你需要这个做什么?@VLAZ但私有字段不是属性,不能用字符串和括号符号访问它们。@Bergi谢谢!搜索时我没有找到。这将用于反射操作,94描述为设计上不可能。