20

是否可以在 nodejs 中启用 EcmaScript 6 Harmony 代理?如果是这样,有什么优点和缺点?有没有关于如何使用它们的文档?谢谢 !

4

5 回答 5

20

调用节点node --harmony-proxies应该可以解决问题。

优点:当您真正需要代理时,代理是一个非常强大的功能。

缺点:当您不需要代理时(大多数情况下应该是),代理是一个非常强大的功能。此外,实施仍应视为实验性的。

至于文档,真正有 atm 的是 Harmony wiki,特别是这个页面,它反映了 V8(以及节点)中代理的当前实现:

http://wiki.ecmascript.org/doku.php?id=harmony:proxies

于 2012-05-19T16:19:28.713 回答
2

我推荐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属性,以便我们可以测试对象成员是否已更改,并且我们还删除了已设置为未定义的成员。

于 2013-09-19T16:15:00.273 回答
1

您可以使用 pimped-proxy,它是代理的轻量级实现,使声明更容易并且与 ES5 兼容。与原生 Proxy 不同,它只能代理创建时已知的属性。

https://github.com/Boulangerie/pimped-proxy

于 2016-12-10T09:08:57.680 回答
1

Proxy现在可以在 Node 版本 >= 6 中本地使用。

于 2017-03-08T21:16:27.297 回答
-11

Harmony 代理对于 nodejs 来说并不能很好地工作,因为它们实际上是同步类型的函数调用。也就是说,您不能实现异步的代理方法。

有关示例,请参见此 GitHub 存储库: https ://github.com/mschwartz/SilkJS-Harmony

于 2012-11-08T16:42:16.587 回答