为什么我不能在nowjs中扩展每个人的口袋?

我试图在nowjs的每个人的pocket提供function。 我想这样做, _.extend每个人的口袋,即everyone.now 。 由于某些我无法理解的原因,_. _.extend无法在客户端正确提供该function。

这是我现在的代码:

 var _ = require("underscore"), everyone = require("nowjs").initialize(app); everyone.now.foo = function() {}; _.extend(everyone.now, { bar: function() {} }); console.log(everyone.now.foo); // [Function] console.log(everyone.now.bar); // undefined 

在服务器和客户端,我可以做now.foo()就好了。 另一方面, now.bar()失败,因为now.bar没有定义。 客户端和服务器端都是这种情况。 我试图检查服务器端是否存在,如上面最后一行所示。 但是,这行日志undefined

Underscore的extend函数(显然)在其他对象上工作,所以我想这跟现在使用的“魔法命名空间”有关。

如何扩展不适用于everyone.now ,我怎样才能使它工作?


编辑2:我进一步挖掘代理。 它似乎是通过传递一个variables作为其名称不起作用来设置代理上的属性。 我删除了我的第一个编辑,因为这个testing用例缩小了。

为什么这不起作用? 这是一个错误? (大多数时候我自己问这个问题,我知道这不是,但这真的让我无能为力……)

 var proxy = Proxy.create({ get: function(pr, name) { console.log("get called"); return null; }, set: function(pr, name, value) { console.log("set called"); } }); var key = "foo"; proxy["foo"] = "bar"; proxy[ key ] = "bar"; proxy["foo"]; proxy[ key ]; 

logging结果:

 set called get called get called 

显然, proxy[ key ] = "bar"; 不会导致在代理上调用set 。 这是为什么?

       

网上收集的解决方案 "为什么我不能在nowjs中扩展每个人的口袋?"

他们在NowJS网站上发布了关于如何在Windows上使用node-proxy 的博客文章 ,而不是使用--harmony_proxies标志的原生V8实现。

看来,Node目前使用的V8版本包含了一些关于代理的错误,这些错误导致了问题中所描述的怪异行为。 然而, node-proxy是一个启用代理的模块(NowJS的“神奇命名空间”的核心), 没有这些bug。 (这个bug在V8的更新版本中也是固定的,但这需要定制一个Node。)

我只是无法弄清楚如何在Windows上构buildnode-proxy (这是一个.node插件,而不是纯粹的JavaScript代码)。 在上面的博客文章中,他们发布了编译好的模块,现在一切都像魅力一样。

修理:

  • 下载编译的模块
  • 将该文件夹解压到node_modules文件夹并将其重命名为now
  • 不要使用代理标志运行节点

编辑:节点0.7.0使用V8 3.8.6也解决了这个问题。 只需使用--harmony标志运行,并删除对node-proxy的引用。