【发布时间】:2021-10-20 16:56:09
【问题描述】:
简介
为了获取类实例的属性,我们可以使用Object.getOwnPropertyNames() 方法,如下例所示
class People {
constructor(name, age) {
this.name = name;
this.age = age;
}
getProperties() {
return Object.getOwnPropertyNames(this);
}
}
console.log(new People("John", 20).getProperties())
这确实有效,因为对象的属性是public。但如果对象的属性是private,则此方法不起作用。
问题
假设您不希望用户在类方法之外直接修改name 和age 属性,因此您将它们设为私有。但是,您还希望有一种方法可以在另一个实例中复制一个实例。由于Object.getOwnPropertyNames() 不适用于私有属性,因此您无法访问密钥以使clone():
class People {
#name; #age;
constructor(name, age) {
this.#name = name;
this.#age = age;
}
clone(o) {
Object.getOwnPropertyNames(this).forEach(key => this[key] = o[key]);
}
getName() { return this.#name }
}
p1 = new People("John", 20);
p2 = new People("", 0);
p2.clone(p1); // Now p2 should have the same properties of p1
console.log(p2.getName()); // Prints "" and should print "John"
问题
有没有办法从类方法内部访问类的私有属性名称?
【问题讨论】:
-
getOwnPropertyNames不包含私有属性。您必须手动复制它们。 -
我不明白“有没有办法从类方法内部访问类的私有属性?”这个问题。当然有,你在
getName类方法中演示它。你也可以把copy写成this.#name = o.#name; this.#age = o.#age。如果您想询问枚举私有属性的方法,请edit您的问题。 -
@Bergi 感谢您的建议,已更正。是的,我想要的是获得一个具有私有属性 names 的数组(或类似数组)。
-
@AlexandroPalacios 很抱歉,这是不可能的。在四处寻找参考资料时,我才意识到我之前已经回答过这个问题:-)
标签: javascript class private class-fields