问题标签 [es6-proxy]
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 - 代理索引被转换为字符串
尝试新的代理对象时,我很惊讶当设置代理时,键会自动转换为字符串:
我希望那typeof key
会是number
,因为我传递了一个数字。但是,它会以某种方式转换为内部字符串,Proxy
并且实际的警报类型是string
. 您可以在此处看到一个展示问题的小型 JSFiddle 。arr
即使通过代理,它仍然是一个数组。
那么,我如何区分传递字符串和数字呢?我可以像 in 一样将其正则表达式/\d+/.test(key)
,但是它不会区分这些情况,而且感觉就像一个 hack:
javascript - 拦截对 DOM API 函数的调用
我需要拦截对某些 DOM API 函数的调用并将它们的参数存储为副作用。例如,假设我对函数getElementsByTagName
和getElementById
. 请参见下面的示例:
一个重要的注意事项是我使用的是node.js并且document
对象是由jsdom库实现的。到目前为止,我尝试利用 ES6 代理来修改上述 DOM 函数的行为。
这就是我试图代理文档对象以捕获所有方法调用的方式。我想知道是否以及如何使用这种技术或其他技术来解决我的问题。
typescript - 如何将类型参数的方法添加到使用代理的类型
我正在为我的内部使用开发一个简单的 RPC 客户端/服务器库。我想使用一个接口来描述客户端和服务器,这样我就可以在我的通用应用程序中的服务器和浏览器之间共享它们。
服务器很简单,服务只是扩展了我的 Service 类并实现了一个描述 API 的接口。
客户端将实现为 ES6 代理,只需将所有方法调用发送到服务器,我希望它具有强类型以及服务类。我需要 ServiceClient 类型的实例来拥有它的类型参数的所有方法和属性,不管它是什么。
我在考虑这种语法:
我试图浏览一些类似的类型,但找不到方法。谢谢您的帮助。
javascript - 为任何函数创建通用处理程序
我想为我的对象上的任何函数创建一个通用处理程序:
我没有在 obj 上定义任何函数(它是 = {})。我希望以某种方式对 obj 上的属性的任何调用都会调用我的处理程序:
javascript - 为什么 Object.keys() 和 Object.getOwnPropertyNames() 在使用 ownKeys 处理程序在代理对象上调用时会产生不同的输出?
我有以下代理:
MDN说:
这个陷阱可以拦截这些操作:
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.keys()
Reflect.ownKeys()
因此,我期望Object.getOwnPropertyNames()
和Object.keys()
产生相同的输出。但是,Object.getOwnPropertyNames(p)
返回['a', 'b']
(如预期),但Object.keys(p)
返回一个空数组。这是为什么?
此外,如果我向该对象添加一个未由ownKeys
处理程序返回的属性(例如c
),它会被两个函数忽略(它们不会更改其输出)。但是,当我添加ownKeys
处理程序返回的属性(例如a
)时,Object.keys(p)
现在返回['a']
.
代码片段:
javascript - Array.prototype.forEach() 在使用 get 处理程序的代理上调用时不起作用
我有以下代理:
它是一个类似数组的对象,因为它具有数值属性和length
指定元素数量的属性。我可以使用循环对其进行迭代for...of
:
但是,该forEach()
方法不起作用。
此代码不记录任何内容。永远不会调用回调函数。为什么它不起作用,我该如何解决?
代码片段:
javascript - 使用 ES6 代理捕获 Object.hasOwnProperty
我想使用 ES6 代理来捕获以下常见代码:
但是查看代理文档后,我不知道该怎么做,主要是has
陷阱陷阱是给in
操作员的,上面的代码中似乎没有使用它,并且没有用于hasOwnProperty
操作的陷阱。
javascript - 如何删除代理创建的对象的属性?
和代码一样,删除操作没有效果。
我在 MDN 上阅读了删除运算符:
删除运算符从对象中删除给定的属性。删除成功返回true,否则返回false。但是,重要的是要考虑以下情况:
如果您尝试删除的属性不存在,则 delete 不会产生任何效果并返回 true
如果对象的原型链上存在同名的属性,那么在删除后,对象将使用原型链中的属性(也就是说,删除只对自己的属性有影响)。
任何用 var 声明的属性都不能从全局作用域或函数作用域中删除。
因此,delete 不能删除全局范围内的任何函数(无论是函数定义的一部分还是函数表达式的一部分)。
作为对象一部分的函数(除了全局范围)可以用 delete 删除。
任何用 let 或 const 声明的属性都不能从定义它们的范围中删除。
无法删除不可配置的属性。这包括内置对象的属性,如 Math、Array、Object 和使用 Object.defineProperty() 等方法创建为不可配置的属性。
我想我的代码不属于上面这些,那怎么解释呢?谢谢。
javascript - ES6 Proxy 中的 handler.set 返回值
在这段代码中
我有两个问题:
- 如果我在最后一行将属性状态设置为 0 或“”(空字符串),为什么会出现错误?
未捕获的类型错误:代理上的“设置”:属性“状态”的陷阱返回错误(…)
- 在规范中它说我应该返回一个布尔值。但就我而言,在 set() 方法中,我不返回任何布尔值。在那种情况下,为什么这段代码有效?
javascript - 使用代理创建动态不可配置属性
我想使用 Proxy 创建动态的不可配置属性。我试过这个:
但我收到一个错误:
TypeError: 'getOwnPropertyDescriptor' on proxy: trap reported non-configurability for property 'test' which is either non-existant or configurable in the proxy target
MDN说:
如果属性不作为目标对象的自有属性存在或作为目标对象的可配置自有属性存在,则不能将其报告为不可配置。
但它并没有解释这背后的原因是什么。
这个错误有什么解决方法吗?