我在nodejs中使用JSON-RPC库。我按名称注册我的函数(例如rpc({publicName: privateFunction})
),RPC lib为我调用函数并处理编组JSON和函数参数。它适用于简单的函数,但是当我传递一个原型函数(在对象的原型链上定义的函数)时它会中断。问题是RPC lib正在使用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
的上下文?
答案 0 :(得分:3)
您可以使用Function.bind()
将特定上下文绑定到函数。它在所有环境中都无济于事,但如果您需要传统支持,MDN页面上会有一个垫片可供您使用。
因此,在您的示例中,您可以添加:
myObjInstance.showProps = myObjInstance.showProps.bind(myObjInstance);
答案 1 :(得分:0)
在最后一行:
myObjInstance.showProps.apply(this, [',']);
this
指向全球范围(或者您在此时所处的任何范围,不指向myObjInstance
)。你应该这样称呼它:
myObjInstance.showProps.apply(myObjInstance, [',']);
第一个参数是上下文,它应该是你的对象实例。