有没有办法将 javascript 对象属性设为私有?

Edu*_*elo 2 javascript object access-modifiers

如何将 javascript 对象属性设为私有,并且Object.keys()不Object.getOwnPropertyNames()返回该属性?

小智 5

如何将 JavaScript 对象属性设为私有,并且Object.keys()不Object.getOwnPropertyNames()返回该属性?

您使用“私人”一词,然后您描述的行为与该词通常含义不同。

“私有”通常意味着属性或值不能从对象外部访问。不被报告Object.keys()被称为不可枚举。

默认情况下,定义的任何属性都defineProperty不可枚举,因此

Object.defineProperty(obj, 'privateField', {value: 5});
Run Code Online (Sandbox Code Playgroud)

或者,明确指定它,如

Object.defineProperty(obj, 'privateField', {value: 5, enumerable: false});
Run Code Online (Sandbox Code Playgroud)

将导致obj.privateField不可枚举,因此不包含在 的结果中Object.keys()。

如果您确实希望属性在通常意义上是私有的(这意味着不能从对象的外部方法访问它),那么一些选项包括:

  1. 使用 TypeScript 及其private关键字。这将导致尝试的外部访问引发编译时错误。

  2. 等待 JS 对私有字段的增强,这可能采用以下形式#foo。

  3. 在闭包内使用变量来表示私有值。

  4. 使用符号作为属性名称,尽管这可能无法确保真正的隐私。

  5. 使用 aWeakMap代表私有财产,如另一个答案中所建议的。

  6. Proxy按照评论中的建议将您的对象包装在 a 中,这会阻止对私有财产的访问。

有关更多详细信息和想法,请参阅此问题。