1

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

4

1 回答 1

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. 这将传递字符串 name,levelteam,而不是具有这些名称的任何变量的值。

  2. 在您希望调用方法的对象是全局对象时才有效。

    • 如果您希望定位的对象 ( a) 不是全局的,而是另一个对象 ( b) 上的属性,请更改window为 reference b

      var msgreader = function (message) {
          var props = message.split(",");
          var obj = b[props[0]];
      
          obj[props[1]].apply(obj, props.slice(2));
      }; 
      
    • 否则,您必须使您的对象成为全局对象,或者将其作为属性添加到另一个对象。

于 2013-05-18T14:15:38.790 回答