【问题标题】:Enable Harmony Proxies in nodejs在 nodejs 中启用 Harmony 代理
【发布时间】:2012-05-26 19:27:37
【问题描述】:

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

【问题讨论】:

    标签: node.js ecmascript-harmony


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这确实是必要的,但是我仍然无法让它工作。以下线程和示例也非常有用:github.com/joyent/node/issues/4138
    • 这样的功能“太强大了”是什么意思?
    • UPDATE 2015/10/12:截至目前,V8 尚不支持 ES6 new Proxy() 处理程序,您必须改用 Proxy.create() 或者您可以使用this shim 为你的函数调用起别名
    【解决方案2】:

    我推荐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,让对象上的所有getset 动作都被拦截变得很简单——在这个演示中,我们设置了%is-clean 属性,以便我们可以测试对象成员是否已更改,我们还会删除已设置为 undefined 的成员。

    【讨论】:

    • 这不是 JavaScript
    • 正确。问题是关于 NodeJS,而不是 JavaScript。 CoffeeScript 编译为 JavaScript;如果您更喜欢 JS 而不是 CS,可以将上面的代码复制并粘贴到 js2coffee.org(第二个选项卡)。
    • 好吧,这里有 ecmascript-harmony 代码会很好,因为问题是这样标记的。
    • 我不明白为什么这会被否决......我现在正在使用 Harmony 或其中的一部分来处理 node-cli 咖啡脚本......这正是我需要的。谢谢
    • Coffescript 不是 JS @Joehannes
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 你有那个来源吗?
      • 我当时做了,在 NodeJS 网站上尝试更改日志,很确定它在那里
      【解决方案5】:

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

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

      【讨论】:

      • 我不太明白你在说什么。当然,get 陷阱可以将异步函数作为“方法”返回?
      • Harmony 代码如下:foo = proxy_thing.some_member; some_member 是一个函数调用。我不知道它怎么可能是异步的。
      • SilkJS Fan,我不认为 evert 函数调用需要是异步的——只是不要在里面做 IO,仅此而已。
      • 并非每个函数调用都需要异步,您可以使用代理以与 nodejs 同步的方式处理原始类型的事物。但是,如果您熟悉 Perl 中的 tie 关键字,这将是 Harmony Proxies 的完美用例,但您必须同步从 redis(例如)同步获取您的值。
      • 代理和 (a) 同步性与奶酪三明治和银行假期一样是正交的概念。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 2015-02-16
      相关资源
      最近更新 更多