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

时间:2011-12-04 19:05:12

标签: javascript node.js underscore.js nowjs-sockets ecmascript-harmony

我正在尝试在每个人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。那是为什么?

1 个答案:

答案 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的插件。在上面的博客文章中,他们分发了已编译的模块,现在一切都像魅力一样。

修复:

  • 下载the compiled module
  • 将文件夹解压缩到node_modules文件夹,并将其重命名为now
  • 不要使用代理标志
  • 运行Node

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