gpt4 book ai didi

javascript - 原型(prototype)和回调

转载 作者:行者123 更新时间:2023-11-28 18:48:50 25 4
gpt4 key购买 nike

我现在正在将几个函数转换为原型(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com