gpt4 book ai didi

javascript - 尝试在不可扩展对象上定义属性时,WeakMap polyfill 抛出错误

转载 作者:行者123 更新时间:2023-12-03 07:47:25 24 4
gpt4 key购买 nike

WeakMap polyfill尝试在不可扩展对象上定义属性时抛出错误。这些位于一堆节点、javascript 代码和库的中间,因此我实际上无法指出导致问题的原因。还有许多其他库也有自己的 polyfill。很难调试哪个库导致了错误。并且,错误仅在 IE10 上出现。
为了摆脱它,我在定义属性之前添加了一个检查器,例如(上述文件中的第 26 行):

if (entry && entry[0] === key) {
entry[1] = value;
}
else if (Object.isExtensible(key)) {
defineProperty(key, this.name, {
value: [ key, value ],
writable: true
});
}

我的问题是,按照上面的代码修复它是否安全/正确?如果不是,我应该如何解决我的问题?

最佳答案

据我所知,weakMap polyfill 仅设计用于使用可扩展对象作为键。它根本不适用于不可扩展的对象。

您的修改已经完成,因此它不会引发异常,但不可扩展的项目也不会出现在 weakMap 中。所以,你的修复并不是真正的修复。必须重写该特定的 polyfill 才能处理不可扩展的键。这不是一个简单的修复,因为它需要一种概念上不同的方法。

还有许多其他 Polyfill 采用不同的方法。我还没有研究过哪些在这方面可能更好。我怀疑实际上“弱”(例如允许垃圾收集)与可以处理不可扩展的对象之间存在一些难题。根本问题是,如果你要变得弱,那么你就无法存储对对象本身的引用。因此,您需要存储对该对象的某些字符串表示形式的引用。嗯,JS 对象没有内置的保证唯一的字符串表示形式。因此,通常的解决方法是使用某种计数器来创建一个并将其作为属性存储在对象上,然后将该字符串表示形式存储在映射中。但是,如果该对象不可扩展,那么您也无法这样做。因此,您必须将实际对象引用存储在 map 中,但它不再是真正的“弱”了。你可以看到你是如何陷入困境的。

我认为这是一个 Polyfill 无法完全达到真实效果的情况。不同的 Polyfill 在这方面会有不同的权衡。您选择的一个确实很弱,但要求对象可扩展,以便可以添加属性。

关于javascript - 尝试在不可扩展对象上定义属性时,WeakMap polyfill 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35146538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com