9

みんなのpocketnowjsに機能を提供しようとしています。_.extend私はみんなのポケット、すなわち ingによってそうしたいと思い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何故ですか?

4

1 に答える 1

0

彼らは、フラグを使用したネイティブ V8 実装の代わりに、Windows での使用方法に関するブログ エントリを NowJS Web サイトに投稿しました。node-proxy--harmony_proxies

ノードが現在使用している V8 バージョンには、プロキシに関するいくつかのバグが含まれているようで、質問で概説されているように奇妙な動作を引き起こしていました。ただし、これらのバグなしnode-proxyでプロキシ (NowJS の「魔法の名前空間」のコア) を有効にするモジュールです。(バグは V8 の新しいバージョンでも修正されていますが、それには Node のカスタム ビルドが必要です。)

node-proxyWindows でビルドする方法がわかりませんでした(これは.nodeアドオンであり、純粋な JavaScript ではありません)。上記のブログ投稿では、コンパイル済みのモジュールが配布されており、すべてが魅力的に機能するようになりました。

修正するには:

  • コンパイル済みモジュールをダウンロードする
  • フォルダーをフォルダーに抽出し、名前を次のnode_modulesように変更しますnow
  • プロキシ フラグを指定して Node を実行しないでください

編集:ノード 0.7.0 は、この問題も解決する V8 3.8.6 を使用します。フラグを付けて実行し、--harmonyへの参照を削除してくださいnode-proxy

于 2012-01-10T14:22:00.467 に答える