为什么我不能在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网站上发布了关于如何在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
的引用。