0

nodejs で JSON-RPC ライブラリを使用しています。関数を名前 (例: rpc({publicName: privateFunction})) で登録すると、RPC ライブラリが関数を呼び出して、JSON と関数の引数のマーシャリングを処理します。単純な関数ではうまく機能しますが、プロトタイプ関数 (オブジェクトのプロトタイプチェーンで定義された関数) を渡すと壊れます。問題は、RPC ライブラリがapplyコンテキストを変更する関数を呼び出しているthisため、他のプロトタイプ プロパティ/関数にアクセスできなくなったことです。

問題の例を次に示します。

var MyObj = function(prop1,prop2,prop3){
    this.prop1 = prop1;
    this.prop2 = prop2;
    this.prop3 = prop3;
}

MyObj.prototype.showProps = function(separator){
    console.log(this.prop1 + separator + this.prop2 + separator + this.prop3);
}

var myObjInstance = new MyObj('a', 'b', 'c');
myObjInstance.showProps(',');

// displays a,b,c


// I register the function as rpc({show_props:myObjInstance.showProps}) and the RPC lib calls it like
myObjInstance.showProps.apply(this, [',']);

// displays undefined,undefined,undefined

これを修正するためのより良いテクニックはありますか? thisプロトタイプ関数内のコンテキストを保持する方法はありますか?

4

2 に答える 2

3

Function.bind()特定のコンテキストを関数にバインドするために使用できます。すべての環境で利用できるわけではありませんが、レガシー サポートが必要な場合に使用できるシムが MDN ページにあります。

したがって、あなたの例では次を追加できます:

myObjInstance.showProps = myObjInstance.showProps.bind(myObjInstance);
于 2013-01-07T15:03:16.040 に答える
0

最後の行:

myObjInstance.showProps.apply(this, [',']);

thisグローバルスコープを指します(またはその時点でどのスコープにいる場合でも、を指しませんmyObjInstance。あなたはそれをこのように呼ぶべきです:

myObjInstance.showProps.apply(myObjInstance, [',']);

最初の引数はコンテキストであり、これはオブジェクトインスタンスである必要があります。

于 2013-01-07T15:02:50.283 に答える