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 页面上的 shim。

因此,在您的示例中,您可以添加:

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 回答