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()。
如果您确实希望属性在通常意义上是私有的(这意味着不能从对象的外部方法访问它),那么一些选项包括:
使用 TypeScript 及其private关键字。这将导致尝试的外部访问引发编译时错误。
等待 JS 对私有字段的增强,这可能采用以下形式#foo。
在闭包内使用变量来表示私有值。
使用符号作为属性名称,尽管这可能无法确保真正的隐私。
使用 aWeakMap代表私有财产,如另一个答案中所建议的。
Proxy按照评论中的建议将您的对象包装在 a 中,这会阻止对私有财产的访问。
有关更多详细信息和想法,请参阅此问题。
| 归档时间: |
|
| 查看次数: |
5000 次 |
| 最近记录: |