有没有人使用过ECMAScript Proxies?

时间:2011-04-22 11:46:59

标签: javascript proxy ecmascript-6

我试图抓住ESx (Harmony?) Proxies。我想我现在知道基础知识,但我认为我没有能力利用它们。

有没有人设法使用它们做任何好事?我不知道任何图书馆或其他任何图书馆。

7 个答案:

答案 0 :(得分:6)

有关代理的更多信息,请查看助理教授Tom Van Cutsem的this article。与谷歌的Mark Miller一起,Tom在es-lab项目的工作期间实际上在代理提案中扮演了关键角色,以便将其纳入未来的ECMAScript标准。

此外,请注意DirectProxies.js已被新的reflect.js垫片取代。

最后,查看Sindre Sorhus的negative-array项目,了解一个简单用例的例子。


更新

今天,问这个问题差不多5年了。虽然它们已于2015年成为ECMAScript 2015标准(又称ES6)的一部分,但许多浏览器仍然没有实现它们:

enter image description here

如果您想知道哪些浏览器在您阅读此答案时支持代理,take a look at CanIUse

答案 1 :(得分:5)

代理是一个相当具有战略意义的功能,主要用于实现绑定或高级库抽象。如果您没有看到自己代码的直接用例,请不要担心。事实上,如果你这样做了,你应该在使用它们之前至少考虑两次 - 通常情况下它们是矫枉过正的,并且有一种更简单,更有效的方法来实现同样的目的。

原始提案页面上有几个示例:http://wiki.ecmascript.org/doku.php?id=harmony:proxies

答案 2 :(得分:4)

事情发展了一下! Firefox原生支持Proxies。使用harmony-reflect.js的实现,您可以尝试根据Direct Proxies的建议规范使用代理。这适用于当前的Firefox或latest Chrome

可能的用例:您有一个对象,它表示图形中包含idtype和任意其他用户定义属性的节点。将此节点绘制到屏幕的库也希望将屏幕坐标和类似内容直接保存到此节点。这可能会覆盖现有属性。

现在,您可以将代理移交给绘图库,该绘图库可以访问节点的绘图特定属性。然后,将它们重定向到节点的内部命名空间属性 - 例如,drawing - 以分隔此数据。

这样,根据一个节点的所有数据都可以保存在一个地方。没有必要为不同的库复制和转换它,以后可能会在不同的地方更改相同的属性。

答案 3 :(得分:0)

大多数代理“功能”都可以在当前的Javascript中实现。例如,getter和setter可以作为显式的“setXXX”或“getXXX”方法。

我能想到的代理最大的前沿优势是

  1. 采用当前驻留在恶意浏览器对象中的现有行为,并允许使用纯Javascript实现该行为。 (非常适合浏览器实现者和编写垫片的人)

  2. 让您在不破坏界面的情况下更自由地更改实现(例如,如果从对象中删除属性,您可能会在其位置放置魔法吸气剂以避免破坏旧代码。)

  3. 那就是说,我仍然很好奇这个新功能还有什么好处:)

答案 4 :(得分:0)

首先,我想指出的是:http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies直接代理是ES代理的最新规范,现在是草案的一部分,这意味着这将是ES6标准,一旦它上线,以及最新的壁虎引擎:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy已使用直接代理。

我使用新代理编写了一些代码,使DOM中的子节点可用作其父节点的属性,并且多次获取,多集和函数多次调用它们,类似于查询选择器。如果没有代理,这不能动态完成,并且使用代理使整个代码小于1 KB。

通常,谈话代理使原型设计和元编程变得动态而简单。

答案 5 :(得分:0)

对象无法安全访问,没有eval,例如:

someObj.someMethod.someFunction('param1');

//--> someObj doesn't exist (with fail safe, no error thrown)

答案 6 :(得分:0)

我在库中使用ES6 Proxies和ES6 Promise来实现延迟加载: https://github.com/Daniel-Abrecht/Crazy-Loading

ES6 Proxies目前正在使用Firefox 45和Edge 13以及Chrome 49。