javascript - 有没有办法使 javascript 对象属性私有(private)化?

标签 javascript object access-modifiers

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

最佳答案

How can I make private a JavaScript object property so that Object.keys() and Object.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)的——这意味着它不能从对象的外部方法访问——那么一些选项包括:

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

  2. 等待 JS 增强 private fields ,可以采用 #foo 的形式。

  3. 在闭包中使用变量来表示私有(private)值。

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

  5. 按照另一个答案中的建议,使用 WeakMap 来表示私有(private)属性。

  6. 按照评论中的建议,将您的对象包装在 Proxy 中,这会阻止对私有(private)属性的访问。

有关更多详细信息和想法,请参阅 this question .

关于javascript - 有没有办法使 javascript 对象属性私有(private)化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45124283/

相关文章:

javascript - google.load - 和消息 "google is not defined"

javascript - 为什么这个字符串不会转义?

JavaScript RegEx 排除某些单词/短语?

JavaScript:自动更新长度属性

php - 在 PHP 中访问数组内部的数组

javascript - 对象内部的 JSON 调用失败。未捕获引用 : data is not defined

javascript - 有没有办法使用扩展运算符合并两个对象,使得结果具有一个对象的键,但具有第二个对象的值?

java - 在没有编译错误的情况下更改对方法的访问

class - 为什么我们不能在Kotlin中将类的可见性标记为 “protected”?

java - 为什么 toString() 不能是静态方法?