我正在尝试掌握ESx (Harmony?) Proxies。我想我现在知道了基础知识,但我不认为我有能力利用它们。
有没有人设法将它们用于任何好处?我不知道任何图书馆或任何这样做的图书馆。
我正在尝试掌握ESx (Harmony?) Proxies。我想我现在知道了基础知识,但我不认为我有能力利用它们。
有没有人设法将它们用于任何好处?我不知道任何图书馆或任何这样做的图书馆。
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.
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 :
If you want to know which browsers support proxies by the time you're reading this answer, take a look at CanIUse.
代理是一个相当具有战略意义的特性,主要用于实现绑定或高级库抽象。如果您没有看到自己代码的直接用例,请不要担心。事实上,如果你这样做了,你应该在使用它们之前至少三思而后行——它们通常是多余的,并且有一种更简单、更有效的方法来实现同样的目的。
原始提案页面上有几个示例:http ://wiki.ecmascript.org/doku.php?id=harmony:proxies
事情发生了一些变化!Firefox 原生支持代理。使用Harmony-reflect.js的实现,您可以根据Direct Proxies的建议规范尝试使用代理。这适用于当前的 Firefox 或最新的 Chrome。
可能的用例:您有一个对象,该对象表示图中包含 、 和任意其他用户定义属性的id
节点type
。将此节点绘制到屏幕上的库希望保存屏幕坐标,并且也直接与此节点类似。这可能会覆盖现有属性。
您现在可以将代理移交给绘图库,该代理可以访问节点的绘图特定属性。然后,将它们重定向到节点的内部命名空间属性——例如drawing
——以分离这些数据。
这样,一个节点的所有数据都可以保存在一个地方。无需为不同的库复制和转换它,并且以后可能会在不同的地方更改相同的属性。
大多数代理“功能”都可以在当前的 Javascript 中实现。例如,getter 和 setter 可以作为显式的“setXXX”或“getXXX”方法。
我能想到的代理的最大前期优势是
采用当前存在于恶意浏览器对象中的现有行为,并允许使用纯 Javascript 实现它。(非常适合浏览器实现者和编写 shims 的人)
在不破坏接口的情况下让您更自由地更改实现(例如,如果从对象中删除属性,您可能会在其位置放置一个魔术 getter 以避免破坏旧代码)。
也就是说,我仍然很好奇这个新功能还有什么其他好处:)
对象故障安全访问,无需评估,例如:
someObj.someMethod.someFunction('param1');
//--> someObj doesn't exist (with fail safe, no error thrown)
首先,我想指出,根据这个: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。
一般来说,谈话代理使原型设计和元编程变得动态和容易。
我在库中使用 ES6 Proxies 和 ES6 Promises 来实现延迟加载: https ://github.com/Daniel-Abrecht/Crazy-Loading
ES6 代理目前在 Firefox 45 和 Edge 13 以及 Chrome 49 中运行。