Почему я не могу расширить карман everyone в nowjs?

Я пытаюсь обеспечить функции в каждом кармане 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.

Функция Underscore extend (очевидно) работает на других объектах, так что я предполагаю, что это как-то связано с "магическим пространством имен", которое использует nowjs.

Почему extending не работает с everybody.now и как я могу заставить его работать?


Edit 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 на прокси. Почему так?

9
задан Charles 8 January 2012 в 11:37
поделиться