在nodejs中是否可以启用EcmaScript 6 Harmony代理?如果可以,它们的优缺点是什么?是否有关于如何使用它们的文档? 谢谢!
在nodejs中是否可以启用EcmaScript 6 Harmony代理?如果可以,它们的优缺点是什么?是否有关于如何使用它们的文档? 谢谢!
使用 node --harmony-proxies
命令可以调用node的代理功能。
优点:当您真正需要它们时,代理是非常强大的功能。
缺点:当您不需要它们时(大多数情况下都是这样),代理是一个过于强大的功能。此外,该实现仍应被视为实验性的。
关于文档,目前真正存在的只有Harmony wiki,特别是此页面,其中反映了V8(因此是node)中代理的当前实现:
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
属性,以便测试对象成员是否已更改,并删除已设置为undefined的成员。
Proxy
现在在Node版本>= 6中本地可用。
Harmony代理在Node.js中可能不会表现出良好的效果,因为它们实际上是同步类型的函数调用。也就是说,您无法实现异步代理方法。
请参阅此GitHub存储库以获取示例: https://github.com/mschwartz/SilkJS-Harmony
get
陷阱可以将异步函数作为“方法”返回? - Andreas Rossbergfoo = proxy_thing.some_member;
some_member是一个函数调用。我不知道它怎么可能是异步的。 - mschwartz
new Proxy()
处理程序,您必须改用Proxy.create()
,或者您可以使用此shim来为您别名函数调用。 - Blake Regalia