如何枚举私有JavaScript类字段

时间:2019-10-20 17:21:31

标签: javascript javascript-objects

我们如何枚举私有类字段?

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();

2 个答案:

答案 0 :(得分:5)

不可能。它们是私有字段,并且没有枚举方法。只有类声明才能静态知道哪些声明了。它们不是属性,cannot access them dynamically甚至没有一个代表私有名称的语言值(就像带括号的符号一样)。

最好的是

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);
}

私有领域提案中有an open issue涉及“ 私有域迭代”,但是TC39成员的第一批评论中指出“私有域不是属性” 。您不能通过设计来反思它们。“。

答案 1 :(得分:0)

也许不是一个优雅的解决方案,但也许您可以修改您的结构以执行以下操作:

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)
    }
  }
}