javascript - WeakMap 和 JavaScript ES6 中类的私有成员有什么区别吗?
问题描述
我试图弄清楚与 WeakMap 构造函数相比,在类中定义本地/私有属性和方法有什么不同?
将它们从外部隐藏的目的是相同的还是有其他东西可以使用它们?
解决方案
鉴于您当前的实现:
- 你
let x
的用处不大,因为它只能在构造函数中被引用。它不能用于任何原型方法。另一方面,WeakMap 可以在任何地方引用。这是一个相当大的区别。 - 您的 WeakMap 可以在任何地方引用。这意味着它实际上并没有提供任何隐私。任何引用实例和 WeakMap 的东西都可以访问
radius
您想要私有的值。
如果您希望 WeakMap通过闭包适当地私有化,您可以使用 IIFE 来定义类,例如:
const myClass = (() => {
const weakMap = new WeakMap();
return class Circle {
// etc
})();
这样,顶层只有对 的引用myClass
,而不是对weakMap
.
只要构造函数中只let x
需要一个变量,我就会在构造函数中使用你的 - 不一定是为了隐藏数据,而只是因为它在构造函数之外没有用处。请参阅为什么限制范围是好的编程实践?
请注意,目前有一个关于可能最终实现的类字段的提案,其中包括私有字段的语法,例如:
class Circle {
constructor(radius) {
this.#x = radius;
// ...
这将允许#x
从 内的任何地方访问Circle
,但不能从其他地方访问。它在功能上等同于WeakMap
实现。
推荐阅读
- python - 在 python 中导入熊猫时出错
- angularjs - 无法注册 Angular 控制器
- facebook - Facebook messenger 复选框插件confirm_optin 未触发messaging_optin webhook 发布到我的服务器
- java - 使用计时器的android自动滑块
- haskell - 在上下文之外结合可能、IO 和函数会导致错误
- c# - 备用行颜色 GroupedListview
- javascript - jsGantt改进的箭头突出显示
- java - 在java中只返回奇数(int)的方法
- webview - Flutter:如何在 Web 视图中启用手势?
- makefile - 如何通过qmake生成makefile并在没有Qt环境的情况下使用它