原型和回调

时间:2016-01-18 14:10:34

标签: javascript

我现在正在将几个函数转换为原型,而且我一直在回调。 以下是我想要实现的最小例子:

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);
    }
}

2 个答案:

答案 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'])