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()
方法的问题。创建