javascript - 原型(prototype)和回调

标签 javascript

我现在正在将几个函数转换为原型(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]}
        {
            // How to transform callback into call ???
            var fn = window[jsonData["callback"]]; // == undefined
            if(typeof fn === 'function')
                fn(jsonData["data"]);
        }
    };
};

function Test()
{
    this.wc = new WebsocketClient();
    // here ws.connect, etc.
}

Test.prototype.send = function()
{
    this.wc.send(test, '{request:"get_data", callback:"on_test"')
}

Test.prototype.on_test = function(arr)
{
    // ...
}

var test = new Test();
test.send();

我想调用t.callback(data),但不知道如何执行此操作? 我尝试过:

window[jsonData["callback"]]; // == undefined
window['Test.prototype.' + jsonData["callback"]]; // == undefined
window['Test.' + jsonData["callback"]]; // == undefined

最佳答案

这里一定有错误:

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"]); 您将失去该方法的原始范围。这样,on_test() 方法中的 this 将指向全局范围。如果不希望出现这种情况,请使用 call() (请参阅上面的更正)。

关于javascript - 原型(prototype)和回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856746/

相关文章:

javascript - 如何将innerHTML添加到打印页面

JavaScript 使用任意数字

javascript - Reactjs 在 setState 不起作用后将值作为 Prop 传递

javascript - 如何使用 jquery 在跨度中显示多行字符串文本?

javascript - 使用 Vue.js 单击时向下滚动

javascript - 从其他子域页面访问子域 iframe url

javascript - 获取WebElement的javascript选择器

javascript - JSON 对象。无法检索模板中的数据。 meteor

javascript - 怎样才能拥有多种功能呢?

javascript - 无法运行 php 代码, Angular 路由问题