Javascript Object.create()和本机私有字段

Javascript Object.create()和本机私有字段,javascript,Javascript,当我通过Object.create(Example.prototype)创建类的实例以绕过其构造函数时,无法再使用本机私有字段: 类示例{ #myPrivateProp; 设置(){ 这是#myPrivateProp=1; } } 常量e1=新示例(); const e2=Object.create(Example.prototype); console.log(e1.setup());//作品 console.log(e2.setup());//未捕获TypeError失败:无法将私有成员#

当我通过
Object.create(Example.prototype)
创建类的实例以绕过其构造函数时,无法再使用本机私有字段:

类示例{
#myPrivateProp;
设置(){
这是#myPrivateProp=1;
}
}
常量e1=新示例();
const e2=Object.create(Example.prototype);
console.log(e1.setup());//作品

console.log(e2.setup());//未捕获TypeError失败:无法将私有成员#myPrivateProp写入其类未声明它的对象
此处定义的不是a而是a。一个私有实例字段不能被其他人公开和操纵,除了这个实例。您不应该克隆该实例及其状态,操作它并替换原始实例

你有两个选择

  • 属于
    Example
    类的静态私有字段,该字段可由该类的任何实例或甚至由创建的对象(如
    Object.create(Example.prototype)
    相互访问和操作
  • 例如,

    class Example {
      static #SECRET = 0;
      constructor(){
      }
    
      addOne() {
        return ++Example.#SECRET;
      }
    }
    
    
    i1 = new Example();
    i2 = new Example();
    console.log(i1.addOne()); // <- 1
    console.log(i2.addOne()); // <- 2
    i3 = Object.create(Example.prototype);
    console.log(i3.addOne()); // <- 3
    Example.#SECRET = 4;      // <- Uncaught SyntaxError: Private field '#SECRET' must be
                              //    declared in an enclosing class
    
    类示例{
    静态#秘密=0;
    构造函数(){
    }
    addOne(){
    return++示例#SECRET;
    }
    }
    i1=新示例();
    i2=新示例();
    
    console.log(i1.addOne());//当使用本机私有字段时,没有。这正是私有字段不好的原因:它们破坏了反射。任何想要使用它们的人都需要知道这一点。在您的上下文中:定义私有字段的人还负责提供
    序列化
    /
    反序列化
    (或
    toJSON
    /
    fromJSON
    )方法对。您可以尝试使用decorator派生一个,但这将涉及调用构造函数。(如果构造函数编写正确,并且只初始化实例,而不执行副作用,那么这实际上应该不是问题)。“不是私有字段,而是私有实例字段。”-嗯,私有实例字段只是一种特定的私有字段。“私有实例字段属于实例,只能由该实例访问和操作”-这不是真的。私有字段可以由
    类中的任何代码从静态方法以及在其他实例上调用的方法访问。您的意思是“只能通过实例访问”吗"? 但这与普通的特定于实例的属性没有任何区别。我真的不知道这如何回答有关在用
    对象实例化的对象上调用
    setup()
    方法的问题。创建