【问题标题】:Why can't I extend everyone's pocket in nowjs?为什么我不能在nowjs中扩展每个人的口袋?
【发布时间】:2012-01-12 18:01:30
【问题描述】:

我正在尝试在 nowjs 的每个人的pocket 中提供功能。我想通过_.extending 每个人的口袋来做到这一点,即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

Underscore 的 extend 函数(显然)确实适用于其他对象,所以我猜它与 nowjs 使用的“神奇命名空间”有关。

为什么扩展不适用于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。这是为什么呢?

【问题讨论】:

  • 在我的系统上运行同样的东西会得到对每个函数两次调用的预期结果。你有什么版本的节点和节点代理?
  • @Logan F. Smyth:我在昨天发布的节点 0.6.5 上运行。我正在运行带有--harmony_proxies 标志的节点,所以我不需要第三方库。可能是 V8 的实现目前包含错误,而 node-proxy 没有。我去看看,谢谢。

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


【解决方案1】:

他们在 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2016-09-16
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多