为什么我现在不能把每个人的口袋都掏出来呢?

Why can't I extend everyone's pocket in nowjs?

本文关键字:口袋 不能 每个人 为什么      更新时间:2023-09-26

我试图在nowjs的每个人的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

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

下划线的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。为什么呢?

他们在NowJS网站上发表了一篇关于如何在Windows上使用node-proxy,而不是使用--harmony_proxies标志的原生V8实现的博客文章。

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

我只是不知道如何在Windows上构建node-proxy(这是一个.node插件;不是纯JavaScript的)。在上面的博客文章中,他们发布了编译后的模块,现在一切都运行得很好。

修复:

  • 下载编译模块
  • 将文件夹解压到node_modules文件夹,并将其重命名为now
  • 不要运行带有代理标志的Node

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