如何将 javascript 对象属性设为私有(private),以便 Object.keys()
和 Object.getOwnPropertyNames()
不返回该属性?
最佳答案
How can I make private a JavaScript object property so that
Object.keys()
andObject.getOwnPropertyNames()
don't return that property?
您使用的是“私有(private)”一词,然后您描述的行为与该词通常所指的行为不同。
“私有(private)”通常意味着不能从对象外部访问该属性或值。未被 Object.keys()
报告被称为不是 enumerable .
defineProperty
定义的任何属性默认情况下是不可枚举的,所以
Object.defineProperty(obj, 'privateField', {value: 5});
或者,明确指定它
Object.defineProperty(obj, 'privateField', {value: 5, enumerable: false});
将导致 obj.privateField
不可枚举,因此不包含在 Object.keys()
的结果中。
如果您真的希望一个属性在通常意义上是私有(private)的——这意味着它不能从对象的外部方法访问——那么一些选项包括:
使用 TypeScript 及其
private
关键词。这将导致尝试的外部访问引发编译时错误。等待 JS 增强 private fields ,可以采用
#foo
的形式。在闭包中使用变量来表示私有(private)值。
使用符号作为属性名称,尽管这可能无法确保真正的隐私。
按照另一个答案中的建议,使用
WeakMap
来表示私有(private)属性。按照评论中的建议,将您的对象包装在
Proxy
中,这会阻止对私有(private)属性的访问。
有关更多详细信息和想法,请参阅 this question .
关于javascript - 有没有办法使 javascript 对象属性私有(private)化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45124283/