我有一个在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()^^
最佳答案
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
)的属性,请将window
更改为引用b
。var msgreader = function (message) {
var props = message.split(",");
var obj = b[props[0]];
obj[props[1]].apply(obj, props.slice(2));
};
否则,您将必须使对象成为全局对象,或将其作为属性添加到另一个对象。