首先,如果对这个问题有一个微不足道的答案,我很抱歉,但我找不到。
我所讨论的概念如下。 我有一个客户端应用程序和一个交换数据的服务器应用程序我试图以下列方式分离处理客户端服务器更新的逻辑。
一个“main”类,用于处理应用程序逻辑并使用已分析和已清理的数据,以及一个“worker”类,用于解析接收到的数据并调用“main”类的相应方法。我想这在某种程度上模仿了事件。这是一个使事情更加清晰的示例结构。
var Main = function(){
this.init();
};
Main.prototype = {
init: function(){
//Do init logic
},
connect: function(){
var client = new Client();
client.onStateUpdate(this.executeStateUpdate);
client.connect('localhost', 3001);
},
executeStateUpdate: function(data){
// Problem - the "this" operator is now Client and not Main
}
};
var Client = function(){
};
Client.prototype = {
connect: function(host, port){
this.client = new WebSocket("ws://"+host+":"+port);
this.client.onmessage = function(e){
var data = JSON.parse(e);
//handle received data
stateUpdate(data);
};
},
stateUpdate: function(data){
//sanitize data to application objects
this.stateUpdateCallback(sanitizedData);
},
onStateUpdate: function(callback){
this.stateUpdateCallback = callback;
}
}
这里最大的问题是从“worker”调用“main”方法会使它们指向错误的对象(例如“Client”而不是“Main”)。 我已经考虑过将“Main”类对象传递给“Client”对象而不是回调,但是这样我必须硬编码将在服务器产生的每个事件上调用的所有回调方法。我对如何解决这个问题的任何建议持开放态度,并坚持使用这种代码架构对我来说不是强制性的。
答案 0 :(得分:1)
我不确定这是否完全解决了您的问题,但解决了您的一个问题。 javascript中的this
将始终引用调用者对象。因此,如果您想从Client函数调用Main方法并仍然希望this
引用Main方法中的Main,您可以使用一个帮助函数,它将使用{{1}调用任何函数方法。
而不是:
function.apply()
使用:
connect: function(){
var client = new Client();
client.onStateUpdate(this.executeStateUpdate);
client.connect('localhost', 3001);
},