【发布时间】:2012-05-26 19:27:37
【问题描述】:
是否可以在 nodejs 中启用 EcmaScript 6 Harmony 代理?如果是这样,有什么优点和缺点?有没有关于如何使用它们的文档? 谢谢!
【问题讨论】:
标签: node.js ecmascript-harmony
是否可以在 nodejs 中启用 EcmaScript 6 Harmony 代理?如果是这样,有什么优点和缺点?有没有关于如何使用它们的文档? 谢谢!
【问题讨论】:
标签: node.js ecmascript-harmony
使用node --harmony-proxies 调用节点应该可以解决问题。
优点:代理在您真正需要时是一项非常强大的功能。
缺点:当您不需要代理时(大多数情况下应该是这样),代理是一个过于强大的功能。此外,实施仍应视为实验性的。
至于文档,真正的 atm 就是 Harmony wiki,特别是这个页面,它反映了 V8(以及节点)中代理的当前实现:
【讨论】:
new Proxy() 处理程序,您必须改用 Proxy.create() 或者您可以使用this shim 为你的函数调用起别名
我推荐harmony-reflect,这样可以很容易地例如设置获取/设置陷阱:
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 属性,以便我们可以测试对象成员是否已更改,我们还会删除已设置为 undefined 的成员。
【讨论】:
您可以使用 pimped-proxy,它是代理的轻量级实现,使声明更容易并且与 ES5 兼容。 与原生 Proxy 不同,它只能代理创建时已知的属性。
【讨论】:
Proxy 现在在 Node 版本 >= 6 中本机可用。
【讨论】:
Harmony 代理对于 nodejs 来说并不能很好地工作,因为它们实际上是同步类型的函数调用。也就是说,您不能实现异步的代理方法。
有关示例,请参阅此 GitHub 存储库: https://github.com/mschwartz/SilkJS-Harmony
【讨论】:
get 陷阱可以将异步函数作为“方法”返回?
foo = proxy_thing.some_member; some_member 是一个函数调用。我不知道它怎么可能是异步的。