我有一个在Websockets中工作的小型多人游戏应用程序。该应用程序由游戏和聊天对象组成,每个对象都有特定的方法。
基本上,客户端会收到格式为:"object,method,arg1,arg2"
的消息字符串,例如“chat,newMsg,foo bar”或“game,addPlayer,name,level,team”。
第一个例子应该翻译成chat.newMsg("foo bar");
,而第二个例子是game.addPlayer(name,level,team);
我现在遇到的困难就是写信息阅读器。
我想找出最优雅的解决方案,例如:
var msgreader = function(message){
msg=message.split(",");
msg[1].apply(msg[0],msg[2]);
}
但是我的消息可以有很多参数,我无法弄清楚如何处理它。 谁能帮助我?我不会使用eval()^^
答案 0 :(得分:4)
apply()
需要一组参数;如果您想单独传递参数,请使用call()
。
但是,apply()
对我们来说是最好的(在正确的用例中),因为我们不知道参数的数量。
var msgreader = function (message) {
var props = message.split(",");
var obj = window[props[0]];
obj[props[1]].apply(obj, props.slice(2));
};
apply()
期望范围作为第一个参数,因此我们提供obj
。请参阅apply()
,slice()
和split()
的文档。
这将传递字符串 name
,level
,team
等,而不是具有这些名称的任何变量的值。
如果您要调用方法的对象是全局对象,则 仅 将起作用。
如果您要定位的对象(a
)不是全局的,但是另一个对象(b
)上的属性,请更改{{ 1}}引用window
。
b
否则,您将 使对象全局化,或将其作为属性添加到另一个对象。