我有一个在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()的文档。


这将传递字符串namelevelteam等,而不是具有这些名称的任何变量的值。
仅当您希望在其上调用方法的对象是全局对象时,此方法才有效。


如果要定位的对象(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));
};

否则,您将必须使对象成为全局对象,或将其作为属性添加到另一个对象。

10-01 02:19
查看更多