问题标签 [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 - 使用 ES6 代理会导致任何函数调用“不是函数”
我试图成为一个鬼鬼祟祟的开发者,结果我迷失在 ES6 Proxies 中。基本上,我想从我编写的另一个类中捕获属性中的任何获取或设置,并确保它们存储在对象之外的其他地方。它看起来像这样:
好吧,这很酷的部分?您可以执行以下操作:
其中,虽然很多工作都是为了一些愚蠢的事情,但我无法解释这让我感到多么高兴。但是,这有一个问题。还记得我放在 MyObject() 中的 superAwesomeFunction() 吗?好吧,每当我现在尝试调用它时,ES6 都会让我感到悲伤:
myProxyObject.superAwesomeFunction 不是函数
ES6 坐上了 LIES 的宝座!它完全在那里,对吗?好的,所以我很确定我捕获了一些错误,因为当我调试时,我看到代理的get部分实际上正在接收 superAwesomeFunction 调用(这很有意义,因为 superAwesomeFunction 是一个包含函数的属性 (){ } )
这是我的问题:是否有人知道任何解决方案可以让我保持可笑的动态属性并仍然调用我的 superAwesomeFunction()?是应用陷阱吗?
javascript - ES6 代理的主要用例
我最近了解了 ES6 代理,但我认为没有充分的理由使用它。我的意思是,一个人可以用 Proxy 做的所有事情都可以在没有它的情况下完成,除非我错过了一些东西。
例如,大多数人在谈到代理时都会谈论验证,但可以应用一些 JS 的优点来验证,每个人都很好。如果有人能让我看到代理的一些主要用例,我将不胜感激。谢谢!
ecmascript-6 - ES2015 代理:断言代理与目标对象相同
有没有一种简单的方法可以断言一个对象是代理的目标对象?
如本文第 6 页所述,等式运算符似乎不起作用:
除了对对象进行字符串化和重新分析之外,有什么方法可以验证它们是否引用了同一个对象?
示例用例:
我想将代理节点与非代理节点进行比较。由于我自己创建了代理,所以我知道预期会发生什么行为。
javascript - 检测代理 getter 是从代理还是目标调用
我正在使用 JavaScript 的Proxy
对象来创建一个get()
处理程序来捕获对类实例的属性访问。
我希望有不同的行为,具体取决于代理是由类中的方法调用还是由代理本身调用。
那可能吗?
编辑:一些示例代码有望解释我正在尝试做的事情:
javascript - 在运行时向控制台方法添加动态值,原始调用位置和行号保持不变
我制作了以下课程来“劫持”该console.log
功能。这背后的原因是我想
动态地添加和删除值。它将用于调试目的,因此函数调用的来源 console.log()
很重要。在下面的代码中,我将在评论中解释我的逻辑。
这种设置的问题在于,新功能是以静态形式分配的。
每次console.log(...)
调用时,都会输出99。所以它几乎是静态的。(领先于你:不,我的目标不是输出随机数,哈哈,但我只是用它来测试输出是否是动态的。)。
烦人的部分是,使用该函数
console.log.bind
是我发现实际保留原始调用者和行号的唯一方法。
我写了以下简单的测试。
问题:如何在运行时向 console.log 添加值而不会丢失原始调用者文件名和行号......并且一旦使用 start() 启动此类,又不会打扰库使用者。
编辑:添加了一个 plkr:https ://embed.plnkr.co/Zgrz1dRhSnu6OCEUmYN0
javascript - 拦截属性查找/检查的方法?
注意:这不是关于最佳实践的问题。该with
声明显然是我们在常规 JS 使用中应该避免的。我对它的行为很感兴趣,因为我正在编写一个简单的DSL,并了解如何突破 JavaScript 的限制以使某些功能发挥作用。
考虑以下代码:
每当我们在块中使用变量时with
(如prop
上面的),它首先查看该变量是否是obj
. 如果是,那么它基本上将该变量转换为obj.prop
.
但是,如果在 中找不到变量obj
,则 JS 引擎会在作用域链上冲浪,prop
直到它到达全局对象作为最后的手段:
这是我的问题:在上面的示例中,JS 引擎prop
在obj
. 有没有办法拦截这个查找?我想“欺骗” JS 引擎(当然,以符合规范的方式)认为obj
每个属性都存在,以便with
语句中引用的所有变量都被解释为obj.variable
. 基本上,我想要这种行为:
我认为这就像代理obj
和拦截get
s 一样简单,因为(我认为)引擎会执行 aget
查看 is obj
has prop
。我认为我可以简单地返回除 之外的其他内容undefined
,然后with
将obj
视为具有所有属性:
但这似乎不起作用。有任何想法吗?
javascript - 流利的异步 api 与 ES6 代理 javascript
所以...我有一些方法。每个方法都返回一个承诺。
我正在尝试进行end to end
测试,因此prom
链必须是线性的(第一次单击,下一次导航等)
目前,我可以做到这一点...
...具有 ES6 代理功能:
但是,我不能做的是以下事情:
因为then
不是代理方法,因此它不会返回myAsyncMethods
。我尝试代理then
但没有结果。
任何想法?
感谢开发者;)
javascript - 创建代理的结构化克隆
我有一个从构造函数返回代理的类。当我尝试将此类的实例存储在 IndexedDB 中或使用 发送对象window.postMessage()
时,我收到一条错误消息,指出无法克隆该对象。结构化克隆算法似乎无法处理代理对象。
以下代码演示了该错误:
任何人都可以建议解决此问题的方法吗?我看到了两个潜在的解决方案,但我不知道如何实现它们:
不要从构造函数返回代理,而是以某种方式在类声明中维护代理功能。
更改 Proxy 实例,使其与结构化克隆算法一起使用。
编辑:以下更简单的代码还演示了结构化克隆错误:
javascript - 用于获取冻结对象的 ES6 嵌套代理
我正在尝试深入代理冻结对象的属性:
这会产生类型错误:
我看到get
代理有以下限制:
如果目标对象属性是不可写、不可配置的自有数据属性,则为属性报告的值必须与相应目标对象属性的值相同。- es6 规范
有没有办法在冻结的对象上嵌套代理?