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

pim*_*vdb 9 javascript node.js underscore.js nowjs-sockets ecmascript-harmony

我正试图在每个人的pocket现状中提供功能.我想_.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
Run Code Online (Sandbox Code Playgroud)

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

Underscore的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 ];
Run Code Online (Sandbox Code Playgroud)

记录结果:

set called
get called
get called
Run Code Online (Sandbox Code Playgroud)

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

pim*_*vdb 0

他们在 NowJS 网站上发布了一篇博客文章,介绍如何node-proxy在 Windows 上使用,而不是使用该标志的本机 V8 实现--harmony_proxies

Node 当前使用的 V8 版本似乎包含多个有关代理的错误,这些错误导致了问题中概述的奇怪行为。node-proxy然而,它是一个启用代理(NowJS“神奇命名空间”的核心)的模块,而没有这些错误。(这些错误也在较新版本的 V8 中得到修复,但这需要自定义构建 Node。)

我只是不知道如何node-proxy在 Windows 上构建(它是一个.node插件;不是纯 JavaScript 的)。在上面的博客文章中,他们分发了编译后的模块,现在一切都像魅力一样。

修理:

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

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