是否可以在 nodejs 中启用 EcmaScript 6 Harmony 代理?如果是这样,有什么优点和缺点?有没有关于如何使用它们的文档?谢谢 !
5 回答
调用节点node --harmony-proxies
应该可以解决问题。
优点:当您真正需要代理时,代理是一个非常强大的功能。
缺点:当您不需要代理时(大多数情况下应该是),代理是一个非常强大的功能。此外,实施仍应视为实验性的。
至于文档,真正有 atm 的是 Harmony wiki,特别是这个页面,它反映了 V8(以及节点)中代理的当前实现:
我推荐Harmony-reflect,它可以很容易地设置 get/set 陷阱:
UPDATE小心,下面是CoffeeScript
require 'harmony-reflect'
handler =
get: ( target, name ) ->
console.log 'get' name
return target[ name ]
set: ( target, name, value ) ->
console.log 'set' name
target[ '%is-clean' ] = no if value isnt target[ name ]
if value is undefined then delete target[ name ]
else target[ name ] = value
return value
clean = ( x ) ->
x[ '%is-clean' ] = yes
return x
p = Proxy {}, handler
p[ 'a' ] = 1
p[ 'b' ] = undefined
console.log p[ 'a' ], p[ 'b' ]
console.log "c" of p, p[ 'c' ]
console.log p
clean p
p[ 'a' ] = 1
console.log p
p[ 'a' ] = 42
console.log p
以上是在 JavaScript 中执行“透明对象持久性”的初始代码。使用harmony-reflect
,它变得微不足道,以便拦截对象上的所有get
操作set
- 在这个演示中,我们设置了一个%is-clean
属性,以便我们可以测试对象成员是否已更改,并且我们还删除了已设置为未定义的成员。
您可以使用 pimped-proxy,它是代理的轻量级实现,使声明更容易并且与 ES5 兼容。与原生 Proxy 不同,它只能代理创建时已知的属性。
Proxy
现在可以在 Node 版本 >= 6 中本地使用。
Harmony 代理对于 nodejs 来说并不能很好地工作,因为它们实际上是同步类型的函数调用。也就是说,您不能实现异步的代理方法。
有关示例,请参见此 GitHub 存储库: https ://github.com/mschwartz/SilkJS-Harmony