问题标签 [weakmap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 带有 WeakMap 或 WeakSet 的 Javascript Flyweight
我想要一个 Flyweight 对象,所以我创建了一个 Object 并将它的实例存储在 Map 中,如下所示:
问题是,当我不再使用 FlyweightNumber 值时,它仍在内存中,存储在此 Map 中。
由于 WeakMap 和 WeakSet 应该让垃圾收集器在不再使用它时将其清除,我如何编写构造函数来返回 WeakSet 或 WeakMap 中的对象,或者如果不再存储它则创建一个新对象?
javascript - 如何以数组为参数新建 WeakMap?
我一直在阅读有关 WeakMap 的 MDN 文档。它提到了语法:
new WeakMap([iterable])
但是当我尝试这个时,发生了错误:
未捕获的类型错误:用作弱映射键的无效值
您能否提供一个有关如何通过数组执行此操作的示例?
javascript - 在 WeakMap 中使用 DOM 节点作为键
与我一起工作时,WeakMap
我遇到了一个令人费解的场景:假设我有一个 DOM 节点,其中包含一些我想要存储的数据,我WeakMap
使用元素/节点本身作为键将其存储在 a 中,并将任意数据作为价值。
在存储和检索条目之间WeakMap
,DOM 节点发生了变化:比如说,它的id
属性被更新了。我希望由于节点已经变异,它将返回,但它仍然以某种方式返回它.get(<Node>)
。undefined
但是,当我销毁 DOM 树中的节点并重新渲染它时——即使不更改它的任何属性或属性——它现在在WeakMap
存储它时也被认为是一个新元素。
我的问题是:为什么要更改用作存储任意数据的键的 DOM 节点 in WeakMap
,而不是 return undefined
?这是一个概念验证示例,其中包含重现行为的说明:
- 点击“存储元素”
- 单击“检索元素”以验证该元素确实存储在
WeakMap
- 单击“变异元素”。该元素应
id
更新其属性。 - 点击“检索元素”:即使元素发生了变异,它仍然可以检索到与原始元素设置的值。
- 单击“销毁并重新创建元素”。节点从 DOM 中移除,并
outerHTML
用于创建外观相同的元素。 - 单击“检索元素”:
WeakMap
正确报告没有找到任何内容,因为我们使用全新的 DOM 节点作为键。
javascript - JavaScript 类 - 使用 WeakMap 将变量设为私有并在其他方法中仍然使用“this”
我正在阅读“Learning JS DataStructs and Algorithms”一书,并在书中说“项目”在下一堂课中是公开的。
但是,如果我使用 WeakMap,那么我可以再次将项目设为私有,仅在给出的示例中,他们没有像我期望的那样使用“this”。
然后它给出了执行 items.set 或 items.get 之类的操作来访问事物的代码示例,这看起来不错,但我想知道是否可以将构造函数中对 item.get(value) 的访问缩短到“这个”像这样:
现在,我可以使用 this.stack 访问 items.get() 功能,但我不确定它是否会再次公开,并且想知道是否有人可以帮我解决这个问题?
javascript - 访问派生类中使用 WeakMap 定义的私有变量
我正在使用常见的 WeakMaps 模式来模拟 es6 类中的私有变量,但我找不到一种方法来拥有“受保护”变量,这意味着变量是私有的并且可以通过派生类访问,例如:
如果我使用相同的模式创建一个子类,我如何someProperty
在子类中访问而不必在基类中定义一个 getter 方法(从而完全违背了为私有属性提供弱映射的整个目的)?
如果使用这种模式没有优雅的解决方案,那么最好的行动方案是什么?我正在构建一个 web 应用程序,它可以有各种“分层窗口”显示各种产品,从一个不同的脚本加载,该脚本对 .php 端点的请求很少以收集这些信息。
图书馆本身并不打算成为每个人都可以访问的公共图书馆,大多数其他队友可能需要编辑其中的一部分,但他们仍然会尊重定义的模式/约定
从安全的角度来看,大多数对其他 API 的请求将通过单独的脚本处理有效负载的验证来完成,所以我真正想要完成的是制作可重用的Window
类,这些类可以跨派生类使用某种“受保护”变量,因为它在构建这种特殊类型的 GUI 的过程中肯定会帮助我
javascript - javascript弱映射保持对已删除对象的引用
删除对象时,weakmap
保持对它的引用。
但正常的行为是:当oyu删除对象时,它会自动从weakmap中删除,weakmap不会导致内存泄漏。或
有什么问题吗?weakmap
delete
我已经关闭并打开了 devtool 并且{aa:123}
仍然存在。
期望weakmap
是空的
javascript - JavaScript 扩展一个类,同时将 WeakMap 用于私有变量
我写了一些通过使用私有变量的类WeakMap()
。我通过WeakMap
在类文件的顶部放置一个来做到这一点。
光.js
这很好用,我能够添加一些具有验证和类型检查功能的 getter 和 setter。
现在我想将该类扩展到另一个类,但是在子类文件和父类文件之间共享私有属性信息时遇到了麻烦。
flashingLight.js
当this.lightSwitch
从setInterval
内部的函数调用时,startFlashing
它无法访问对象的状态。
这是因为这些功能分布在两个文件中吗?无论如何,我可以使用私有变量和类扩展吗?
javascript - 关于 WeakMap 和私有变量的问题
在我目前正在阅读的书中,它讨论了我们如何使用 WeakMap 通过下面的示例代码来强制隐私。
我无法理解这样的代码如何真正使齿轮属性私有并且不允许从外部访问。
似乎通过使用
我们正在隐藏 userGear 并将其设为私有,因此无法访问。
但是,当我使用
它向我展示了结果
我不知道为什么我可以访问 userGear 并在此处获取 'P' 而不是 'undefined' 假设它无法访问。
可能我做错了什么或错误地理解了这个概念。
有人可以帮我理解 WeakMap 吗?
javascript - JavaScript/ES6 属性在构造函数中设置值时不使用 setter
我有一个带有构造函数和几个属性的类。
注意到当我在创建对象时设置 Id 时,不使用设置器。
如何使在构造函数中设置的 Id 使用 setter?
javascript - 当 .size 不存在时,在 Node.js 中尝试从 WeakSet/WeakMap(通过垃圾收集)自动删除的项目?
#1。缺乏.size
财产的解决方法?
在 JavaScript 中,我从来没有使用过任何一种WeakSet
或WeakMap
以前,而且我对垃圾回收的了解也不多(我是一名 PHP + JS 开发人员,所以这是我第一次真正需要考虑垃圾收藏)。但我认为我现在有一个很好的用例WeakMap
。所以我想至少开始尝试它。
我想在我的实验中确认的主要事情是当对象被垃圾收集时自动删除它们。WeakSet.size
如果我可以访问实例上的/属性来检查它们的大小,这将很容易测试WeakMap.size
,但它们在“弱”版本中不存在。
如果可能的话,我猜测结果可能会有所不同,因为大小将取决于垃圾收集器是否已经运行。但这没关系,因为这些实验代码都不会在生产中使用……我只是想确认我确实了解垃圾收集和 WeakSet/WeakMap 是如何工作的。在无法测试(因此完全理解)的情况下使用此功能的想法让我非常不安,我担心我最终会在为时已晚时发现内存泄漏(在生产中)。
是否有任何解决方法或替代方法来处理缺少WeakSet.size
和WeakMap.size
...至少仅用于调试/测试/学习目的?
如果不是.size
解决方法,是否有办法检查我的WeakMap
集合实例的内存使用情况?这将同样有用,因为这是主要关注点所在。
我现在唯一能想到的就是检查整个 Node.js 进程的内存......这对我来说似乎不太可靠。
#2。.length 有什么用?
此外,我对为什么.length
在两者的类构造函数/实例原型上都有一个属性WeakSet
以及WeakMap
(而不是在它们的实例上)有点困惑。
根据:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
...两页都说.length
是:
The value of the length property is 0.
他们真的只是一直硬编码为数字 0 吗?那有什么意义呢?
在 Google 上搜索“WeakSet.length”或“WeakMap.length”(包括精确结果的双引号)不会产生更多信息,每个结果只有大约 20 个,这只是 MDN 页面的镜像。