问题标签 [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.

0 投票
3 回答
3485 浏览

javascript - 使用 ES6 代理会导致任何函数调用“不是函数”

我试图成为一个鬼鬼祟祟的开发者,结果我迷失在 ES6 Proxies 中。基本上,我想从我编写的另一个类中捕获属性中的任何获取或设置,并确保它们存储在对象之外的其他地方。它看起来像这样:

好吧,这很酷的部分?您可以执行以下操作:

其中,虽然很多工作都是为了一些愚蠢的事情,但我无法解释这让我感到多么高兴。但是,这有一个问题。还记得我放在 MyObject() 中的 superAwesomeFunction() 吗?好吧,每当我现在尝试调用它时,ES6 都会让我感到悲伤:

myProxyObject.superAwesomeFunction 不是函数

ES6 坐上了 LIES 的宝座!它完全在那里,对吗?好的,所以我很确定我捕获了一些错误,因为当我调试时,我看到代理的get部分实际上正在接收 superAwesomeFunction 调用(这很有意义,因为 superAwesomeFunction 是一个包含函数的属性 (){ } )

这是我的问题:是否有人知道任何解决方案可以让我保持可笑的动态属性并仍然调用我的 superAwesomeFunction()?是应用陷阱吗?

0 投票
4 回答
2463 浏览

javascript - ES6 代理的主要用例

我最近了解了 ES6 代理,但我认为没有充分的理由使用它。我的意思是,一个人可以用 Proxy 做的所有事情都可以在没有它的情况下完成,除非我错过了一些东西。

例如,大多数人在谈到代理时都会谈论验证,但可以应用一些 JS 的优点来验证,每个人都很好。如果有人能让我看到代理的一些主要用例,我将不胜感激。谢谢!

0 投票
1 回答
82 浏览

ecmascript-6 - ES2015 代理:断言代理与目标对象相同

有没有一种简单的方法可以断言一个对象是代理的目标对象?

如本文第 6 页所述,等式运算符似乎不起作用:

除了对对象进行字符串化和重新分析之外,有什么方法可以验证它们是否引用了同一个对象?

示例用例:

我想将代理节点与非代理节点进行比较。由于我自己创建了代理,所以我知道预期会发生什么行为。

0 投票
1 回答
449 浏览

javascript - 检测代理 getter 是从代理还是目标调用

我正在使用 JavaScript 的Proxy对象来创建一个get()处理程序来捕获对类实例的属性访问。

我希望有不同的行为,具体取决于代理是由类中的方法调用还是由代理本身调用。

那可能吗?

编辑:一些示例代码有望解释我正在尝试做的事情:

0 投票
4 回答
1130 浏览

javascript - 在运行时向控制台方法添加动态值,原始调用位置和行号保持不变

我制作了以下课程来“劫持”该console.log功能。这背后的原因是我想 动态地添加和删除值。它将用于调试目的,因此函数调用的来源 console.log()很重要。在下面的代码中,我将在评论中解释我的逻辑。

这种设置的问题在于,新功能是以静态形式分配的。

每次console.log(...)调用时,都会输出99。所以它几乎是静态的。(领先于你:不,我的目标不是输出随机数,哈哈,但我只是用它来测试输出是否是动态的。)。

烦人的部分是,使用该函数 console.log.bind是我发现实际保留原始调用者和行号的唯一方法。

我写了以下简单的测试。

问题:如何在运行时向 console.log 添加值而不会丢失原始调用者文件名和行号......并且一旦使用 start() 启动此类,又不会打扰库使用者。

编辑:添加了一个 plkr:https ://embed.plnkr.co/Zgrz1dRhSnu6OCEUmYN0

0 投票
1 回答
90 浏览

javascript - 拦截属性查找/检查的方法?

注意:这不是关于最佳实践的问题。该with声明显然是我们在常规 JS 使用中应该避免的。我对它的行为很感兴趣,因为我正在编写一个简单的DSL,并了解如何突破 JavaScript 的限制以使某些功能发挥作用。


考虑以下代码:

每当我们在块中使用变量时with(如prop上面的),它首先查看该变量是否是obj. 如果是,那么它基本上将该变量转换为obj.prop.

但是,如果在 中找不到变量obj,则 JS 引擎会在作用域链上冲浪,prop直到它到达全局对象作为最后的手段:

这是我的问题:在上面的示例中,JS 引擎propobj. 有没有办法拦截这个查找?我想“欺骗” JS 引擎(当然,以符合规范的方式)认为obj每个属性都存在,以便with语句中引用的所有变量都被解释为obj.variable. 基本上,我想要这种行为:

我认为这就像代理obj和拦截gets 一样简单,因为(我认为)引擎会执行 aget查看 is objhas prop。我认为我可以简单地返回除 之外的其他内容undefined,然后withobj视为具有所有属性:

但这似乎不起作用。有任何想法吗?

0 投票
2 回答
2434 浏览

javascript - 流利的异步 api 与 ES6 代理 javascript

所以...我有一些方法。每个方法都返回一个承诺。

我正在尝试进行end to end测试,因此prom链必须是线性的(第一次单击,下一次导航等)

目前,我可以做到这一点...

...具有 ES6 代理功能:

但是,我不能做的是以下事情:

因为then不是代理方法,因此它不会返回myAsyncMethods。我尝试代理then但没有结果。

任何想法?

感谢开发者;)

0 投票
1 回答
1560 浏览

javascript - 创建代理的结构化克隆

我有一个从构造函数返回代理的类。当我尝试将此类的实例存储在 IndexedDB 中或使用 发送对象window.postMessage()时,我收到一条错误消息,指出无法克隆该对象。结构化克隆算法似乎无法处理代理对象。

以下代码演示了该错误:

任何人都可以建议解决此问题的方法吗?我看到了两个潜在的解决方案,但我不知道如何实现它们:

  1. 不要从构造函数返回代理,而是以某种方式在类声明中维护代理功能。

  2. 更改 Proxy 实例,使其与结构化克隆算法一起使用。

编辑:以下更简单的代码还演示了结构化克隆错误:

0 投票
0 回答
1948 浏览

javascript - 用于获取冻结对象的 ES6 嵌套代理

我正在尝试深入代理冻结对象的属性:

这会产生类型错误:

我看到get代理有以下限制:

如果目标对象属性是不可写、不可配置的自有数据属性,则为属性报告的值必须与相应目标对象属性的值相同。- es6 规范

有没有办法在冻结的对象上嵌套代理?

0 投票
0 回答
30 浏览

javascript - 代理目标:地图对象

我正在尝试将Map设置为Proxy的目标 ,但出现以下错误:

未捕获的 TypeError:this.proxy.family.set 不是函数

我相信该错误与和对象中的两种.set()方法有关。MapProxy

问题:如何将 a 设置Map为 aProxy的目标?