我正在尝试在每个人pocket
的nowjs中提供功能。我想通过_.extend
每个人的口袋,即everyone.now
来做到这一点。由于某些我无法理解的原因,_.extend
无法在客户端正确提供该功能。
这是我目前的代码:
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
。
下划线的extend
功能(显然)对其他物体起作用,所以我猜它与现在使用的“魔法命名空间”有关。
如何扩展不适用于everyone.now
,我该如何才能使其发挥作用?
编辑2:我在代理中挖掘了更多内容。看起来像通过传递变量在代理上设置属性,因为它的名称不起作用。我删除了我的第一个编辑,因为这个测试用例更加狭窄。
为什么这不起作用?这是一个错误吗? (我大多数时候都会问自己,我知道事实并非如此,但这真的让我无能为力......)
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 ];
记录结果:
set called
get called
get called
显然,proxy[ key ] = "bar";
不会导致在代理上调用set
。那是为什么?
答案 0 :(得分:0)
他们在NowJS网站上posted a blog entry了解如何在Windows上使用node-proxy
,而不是使用--harmony_proxies
标志的原生V8实现。
似乎Node当前使用的V8版本包含有关代理的几个错误,这些错误导致了问题中概述的奇怪行为。但是,node-proxy
是一个模块,可以启用代理(NowJS的“魔术命名空间”的核心)而不会这些错误。 (错误也在较新版本的V8中修复,但这需要自定义构建的Node。)
我无法弄清楚如何在Windows上构建node-proxy
(它是一个.node
插件;而不是一个纯JavaScript的插件。在上面的博客文章中,他们分发了已编译的模块,现在一切都像魅力一样。
修复:
node_modules
文件夹,并将其重命名为now
编辑:节点0.7.0使用V8 3.8.6,这也解决了这个问题。只需使用--harmony
标记运行,然后删除对node-proxy
的引用。