为什么 Set 与 Proxy 不兼容?

2024-01-03

JavaScriptSet https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Set似乎与 JavaScript 完全不兼容proxies https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy,试图Proxy() a Set()

var p = new Proxy(new Set(), {
  add(target, val, receiver) {
    console.log('in add: ', target, val, receiver)
  }
})
p.add(55)

导致 VMError:

Uncaught TypeError: Method Set.prototype.add called on incompatible receiver [object Object]
    at Proxy.add (native)
    at <anonymous>:1:3

事实上,代理一个Set()以任何方式彻底打破它 - 即使我们的代理处理程序什么也不做!比较p = new Proxy({}, {}) vs p = new Proxy(new Set(), {})。 (这适用于 Firefox (52.0.2) 和 Chromium (57.0.2987.133)。)

我似乎找不到可靠的参考或文档,为什么 JavaScript 不能Proxy a Set对象以及为什么它会遇到虚拟机错误?


我正在尝试Proxy() a Set()

但是,您还没有使用过任何可用的陷阱 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler- 没有add一。您可以在通话中拦截的所有内容p.add(55) is the 财产访问权 to .add在代理上,它通过get陷阱并返回一个函数。

如果您想拦截对add方法,您根本不需要代理,更好(子类化和)覆盖该方法,类似于.set被覆盖here https://stackoverflow.com/a/42381180/1048572 and here https://stackoverflow.com/a/43236808/1048572 for Map.

代理一个Set()以任何方式彻底打破它

是的,因为代理不是Set不再有。

var s = new Set([42]);
var p = new Proxy(s, {});
s.has(42) // true
console.log(s === p) // false
p.has.call(s, 42) // true
p.has(42) // exception - calls `has` on `p`, not on `s`

Calling Set非 True Sets 对象上的方法确实会抛出异常(例如可用于检测它们 https://stackoverflow.com/a/29926193/1048572)。对于您的具体情况,请参阅ECMAScript 6 §23.2.3.1 http://www.ecma-international.org/ecma-262/6.0/#sec-set.prototype.add:

"If S没有[[SetData]]内部插槽,扔一个TypeError例外。"

确实,p是一个代理(它确实有内部代理方法和槽 http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots, 尤其[[ProxyHandler]] and [[ProxyTarget]])而不是像这样的集合s以其[[SetData]]内部插槽。

你合理地期望“如果尚未定义陷阱,则默认行为是将操作转发到目标”,但是这只适用于属性访问等标准行为,而不适用于外来对象的内部插槽。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Set 与 Proxy 不兼容? 的相关文章

随机推荐

  • URL转义MFC字符串

    如何对 MFC CString 进行 URL 转义 InternetCanonicalizeUrl http msdn microsoft com en us library aa384342 28VS 85 29 aspx
  • 即时 (JIT) 编译器有什么作用?

    与非 JIT 编译器相比 JIT 编译器具体做了什么 有人可以给出一个简洁易懂的描述吗 JIT 编译器运行after程序已启动 并将代码 通常是字节码或某种 VM 指令 即时 或称为即时 编译为通常更快的形式 通常是主机 CPU 的本机指令
  • 从 Cocoa 中的文件中仅读取“N”个字节

    如何从指定文件中只读取 N 个字节 如果您希望以类似于通过 NSData 加载文件的方式随机访问文件内容 但不实际将所有内容读取到内存中 则可以使用内存映射 这样做意味着磁盘上的文件被视为虚拟内存的一部分 并且将像常规虚拟内存一样进行页面调
  • C# 获取嵌入资源的完整路径? [复制]

    这个问题在这里已经有答案了 我正在使用一个 NET 组件 该组件使用一种需要具有完整路径名的字符串的方法来读取特定的二进制文件 如下所示 Read c somefile ext 我已将 somefile ext 作为嵌入式资源放入我的项目中
  • 动态应用内设置

    我有一个应用程序 位置很重要 目前 我在设置包中有一个多值设置 其中定义了 5 个位置 这种方法的问题在于设置包是静态的 也就是说 据我所知 我无法从服务器上的 JSON 列表更新它 我想从服务器上的动态列表更新位置列表 我看过 InApp
  • 共享 SwiftUI 视图的屏幕截图导致崩溃

    我正在抓取 SwiftUI 视图中子视图的屏幕截图 立即传递到共享表以共享图像 该视图是来自呈现为一堆卡片的文本数组的一组问题 我正在尝试获取问题的屏幕截图 并将其与应用程序的链接一起共享 使用愤怒的小鸟的链接进行测试 我基本上可以使用 A
  • 读取实例导致解析错误

    我想实现一个 read 实例 使我能够读取字符串 例如 8 3 并构造一个包含这些值的列表 data Value a Nul Val a showsValue Show a gt Value a gt ShowS showsValue Va
  • 在 Azure 数据工厂中引用 JSON 有效负载值作为 If 条件

    我有一个像这样的 Json 文件作为从 API 调用返回的有效负载 这是数据工厂中的 http 数据集类型 count 2 name DatasetABC columnNames Column 1 Column 2 rows 1234 56
  • AWS CLI 上传失败:未知编码:idna

    我尝试使用 AWS CLI 将一些文件推送到 s3 但遇到错误 upload failed An HTTP Client raised and unhandled exception unknown encoding idna 我相信这是一
  • Python 包及其对应的 PyPi 项目可以有不同的名称吗?

    例如 我想知道怎么可能scikit learn是 PyPi 包的名称 而实际的 Python 模块的名称是sklearn 我问的原因是我有一个本地Python包packageA我无法上传到 PyPi 因为该名称恰好已被占用 因此我想知道我是
  • 如何在Delphi中实现一套标准的超链接检测规则

    我目前在程序中自动检测文本内的超链接 我把它做得非常简单 只需要寻找http or www 然而 一位用户建议我将其扩展到其他形式 例如 https or com 然后我意识到它可能不止于此 因为还有 ftp mailto 和 file 所
  • 每个应用程序的长路径行为是否可以通过清单启用?

    尽管 MSDN 文档是什么say https msdn microsoft com en us library windows desktop aa365247 aspx maxpath 您还可以通过以下方式启用每个应用程序的新长路径行为
  • R:如何检查可用的核心数/CPU 使用率

    R 是单线程的 使用 R 如何检查 Windows 和 Linux 中运行 R 的核心 线程数 或者正在运行多少卢比 使用R 如何检查Windows和Linux中运行R的每个核心的使用情况 或者每个 R 使用的 CPU 百分比 例如 如果我
  • IIS 7.5 在哪里记录错误?

    IIS 7 5 在哪里记录错误 事件查看器 日志档案 我收到一个非常不具体的内部 500 错误 我想了解更多 我正在运行 PHP 我做了什么最后一条评论 http forums iis net t 1169733 aspx在这个帖子上说 但
  • 检测直角三角形的C程序

    如果给我坐标系中的 100 个点 我必须找出这些顶点中是否存在直角三角形 有没有一种方法可以检测这些顶点中的直角三角形 而不必选择所有 3 个顶点对 然后对它们应用毕达哥拉斯定理 有更好的算法吗 谢谢你的帮助 这是一个O n 2 log n
  • 对绑定到 DataTable 的 GridView 进行排序

    我有一个存储库 其中包含我正在处理的这个项目的所有 LINQ 查询 我能够将 LINQ 结果获取到 DataTable 并将其绑定到 gridview 以显示数据 现在我需要使 gridview 可排序 我已经设定AllowSorting
  • 如何确定 Git 中合并提交的第一个父级

    我正在阅读有关使用的差异 vs git 中的运算符 我遇到了这个问题Git 中的 HEAD 和 HEAD 有什么区别 https stackoverflow com q 2221658 2498327 在谷歌搜索后 我在网上找不到一个很好的
  • 当我有触摸事件处理程序时,为什么我的鼠标事件处理程序不工作?

    我的一些最终用户拥有触摸屏 其他用户则拥有 PC 在触摸屏上 PreviewMouseUp Down与触摸事件处理程序一起触发 导致重复行为 在 PreviewMousUp Down 中编写的函数被执行两次 所以我的示例按钮 XAML
  • 当涉及两个输入时,jQuery 模糊不断触发

    我在 Google 和 Stack Overflow 上搜索了一段时间 但找不到与此相关的任何内容 我有多个输入文本字段 当模糊时 它们会向服务器调用 jQuery AJAX 函数 它几乎可以完美地工作 问题是 如果我专注于一个文本输入 然
  • 为什么 Set 与 Proxy 不兼容?

    JavaScriptSet https developer mozilla org en docs Web JavaScript Reference Global Objects Set似乎与 JavaScript 完全不兼容proxies