如何将字符串“a,b,c,d ...”转换为a.b(c,d,...);执行

时间:2013-05-18 14:11:52

标签: javascript string

我有一个在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()^^

1 个答案:

答案 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()的文档。

  1. 这将传递字符串 namelevelteam等,而不是具有这些名称的任何变量的值。

  2. 如果您要调用方法的对象是全局对象,则 将起作用。

    • 如果您要定位的对象(a)不是全局的,但是另一个对象(b)上的属性,请更改{{ 1}}引用window

      b
    • 否则,您将 使对象全局化,将其作为属性添加到另一个对象。