10

我正在尝试掌握ESx (Harmony?) Proxies。我想我现在知道了基础知识,但我不认为我有能力利用它们。

有没有人设法将它们用于任何好处?我不知道任何图书馆或任何这样做的图书馆。

4

7 回答 7

6

For more info on proxies, check out this article by Assistant Professor Tom Van Cutsem. Together with Google's Mark Miller, Tom actually played a key role in the proposal of proxies for inclusion in a future ECMAScript standard during his work at the es-lab project.

Further, note that DirectProxies.js has been superseded by the new reflect.js shim.

Finally, check out Sindre Sorhus's negative-array project for an example of simple use case.


UPDATE:

Today, it's almost 5 years since this question was asked. While they have become part of the ECMAScript 2015 standard (aka ES6) in 2015, many browsers still haven't implemented them :

enter image description here

If you want to know which browsers support proxies by the time you're reading this answer, take a look at CanIUse.

于 2013-11-15T02:14:14.333 回答
6

代理是一个相当具有战略意义的特性,主要用于实现绑定或高级库抽象。如果您没有看到自己代码的直接用例,请不要担心。事实上,如果你这样做了,你应该在使用它们之前至少三思而后行——它们通常是多余的,并且有一种更简单、更有效的方法来实现同样的目的。

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

于 2012-01-27T12:00:22.403 回答
4

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

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

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

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

于 2012-01-27T09:34:23.203 回答
0

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

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

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

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

也就是说,我仍然很好奇这个新功能还有什么其他好处:)

于 2012-01-27T12:12:12.157 回答
0

对象故障安全访问,无需评估,例如:

someObj.someMethod.someFunction('param1');

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

于 2014-03-04T08:50:27.337 回答
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。

一般来说,谈话代理使原型设计和元编程变得动态和容易。

于 2014-01-09T09:56:31.553 回答
0

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

ES6 代理目前在 Firefox 45 和 Edge 13 以及 Chrome 49 中运行。

于 2016-03-21T11:09:00.333 回答