在Node.js中启用Harmony Proxies

20

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

5个回答

20

使用 node --harmony-proxies 命令可以调用node的代理功能。

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

缺点:当您不需要它们时(大多数情况下都是这样),代理是一个过于强大的功能。此外,该实现仍应被视为实验性的。

关于文档,目前真正存在的只有Harmony wiki,特别是此页面,其中反映了V8(因此是node)中代理的当前实现:

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


1
这确实是必要的,但我仍然有困难让它工作。以下线程和示例也非常有用:https://github.com/joyent/node/issues/4138 - odedfos
这个功能有什么“太强大”的地方吗? - JSON
9
更新于2015/10/12:截至目前,V8引擎尚不支持ES6的new Proxy()处理程序,您必须改用Proxy.create(),或者您可以使用此shim来为您别名函数调用。 - Blake Regalia

2
我推荐使用harmony-reflect,它可以轻松设置获取/设置代理。注意,下面是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,可以轻松地拦截对象上的所有getset操作——在此演示中,我们设置了一个%is-clean属性,以便测试对象成员是否已更改,并删除已设置为undefined的成员。


5
这不是 JavaScript。 - Ege Özcan
2
正确。问题是关于NodeJS,而不是JavaScript。CoffeeScript编译成JavaScript;如果你更喜欢JS而不是CS,你可以将上面的代码复制粘贴到js2coffee.org(第二个选项卡)中。 - flow
既然问题被标记为ecmascript-harmony,那么在这里放置ecmascript-harmony代码会很好。 - Ege Özcan
1
我不明白为什么这被踩了... 我现在只是在使用harmony中的一部分来开发一个node-cli的coffeescript应用,这正是我所需要的。谢谢。 - Joehannes
Coffeescript不是JS @Joehannes - Snuggs

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

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


1

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


你有相关的来源吗? - Omri Luzon
我当时确实尝试过在NodeJS网站上查看更改日志,相信它在那里。 - Scott Jungwirth

-11

Harmony代理在Node.js中可能不会表现出良好的效果,因为它们实际上是同步类型的函数调用。也就是说,您无法实现异步代理方法。

请参阅此GitHub存储库以获取示例: https://github.com/mschwartz/SilkJS-Harmony


1
我不太明白你的意思。当然,get陷阱可以将异步函数作为“方法”返回? - Andreas Rossberg
Harmony代码如下:foo = proxy_thing.some_member;some_member是一个函数调用。我不知道它怎么可能是异步的。 - mschwartz
1
SilkJS的粉丝,我认为并不是每个函数调用都需要是异步的——只要不在内部进行IO操作就可以了。 - andreypopp
并非每个函数调用都需要是异步的,您可以使用代理以同步方式处理nodejs中的原始类型。但是,如果您熟悉Perl中的tie关键字,则它将是Harmony Proxies的完美用例,但您必须通过同步方式从redis(例如)按键获取值。 - mschwartz
14
代理和(异)步性就像奶酪三明治和银行假日一样正交。 - flow
为了补充讨论,说明这个答案的错误之处,即将推出的async await将允许您使用类似同步的模式从getter返回值。在此之前,还有node-fibers和generators也可以实现这一点。 - Levi Roberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接