我现在正在将几个函数转换为原型,而且我一直在回调。 以下是我想要实现的最小例子:
t.callback(data)
我想打电话给window[jsonData["callback"]]; // == undefined
window['Test.prototype.' + jsonData["callback"]]; // == undefined
window['Test.' + jsonData["callback"]]; // == undefined
,但无法弄清楚如何做到这一点?
我试过了:
@FXML
public void copyToClipboardRaw() {
copyToClipboard(rawCode);
}
@FXML
public void copyToClipboardHTML() {
copyToClipboard(codeForHTML);
}
private void copyToClipboard(TextField source) {
if(code == null || code.isEmpty()) {
nothingToCopyAlert();
} else {
Clipboard clipboard = Clipboard.getSystemClipboard();
ClipboardContent content = new ClipboardContent();
content.putString(source.getText());
clipboard.setContent(content);
}
}
答案 0 :(得分:3)
这里肯定有错误:
Test.prototype.send = function()
{
// use 'this' instead of 'test'
// this.wc.send(test, '{request:"get_data", callback:"on_test"')
this.wc.send(this, '{request:"get_data", callback:"on_test"')
}
由于在on_test()
上定义了Test.prototype
,所以请按照以下方式调用:
WebSocketClient.prototype.send = function(t, data)
{
this.ws.send(data);
this.ws.onmessage = function(evt)
{
var msg = evt.data;
var jsonData = JSON.parse(msg);
if(jsonData["callback"] !== 'undefined' && jsonData["callback"] !== "") // jsonData = {callback:"on_test", data:[0,1,2]}
{
var fn = t[jsonData["callback"]]; // t will be available in this scope, because you've created a closure
if(typeof fn === 'function') {
fn(jsonData["data"]);
// OR, preserving scope of Test class instance t
fn.call(t, jsonData["data"]);
}
}
};
};
更新:请注意,通过调用fn(jsonData["data"]);
,您将失去方法的原始范围。这样,this
方法中的on_test()
将指向全局范围。如果这是不受欢迎的,请使用call()
(请参阅上面的更正)。
答案 1 :(得分:0)
如果您的功能在全球范围内,您可以使用
window.call(this, 'functionName', arguments)
在你的情况下,
window.call(this, jsonData['callback'], jsonData['data'])
通过这样做,将callback
作为参数调用jsonData['data']
。
如果函数在对象test
内,请使用
test.call(this, 'on_test', jsonData['data'])