2013-05-18 62 views
1

我有一个小应用程序多人在工作的WebSockets。该应用程序由一个游戏和一个聊天对象组成,每个对象都有特定的方法。如何变换一个字符串 “A,B,C,d ...” 到A·B(C,d,...);执行

基本上,客户端收到格式如下的消息字符串:"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

[调查 “应用” 功能。](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply)你也将有通过引用'window'或其他东西来找到对象,如果这是事情的方式。真的,如果我在你的情况下,我会开始修复消息格式。 – Pointy

+2

你的工作流程似乎对我有瑕疵。不要发送晦涩的消息,而是发送一些你喜欢处理的内容。 –

+1

虽然您可以在Google Analytics(分析)异步代码中找到此示例:https://developers.google。com/analytics/devguides/collection/gajs/asyncTracking我同意Madara - 你应该直接发送对象和方法来代替。发送实际的Javascript:obj.method(c,d,...);而不是数组,你必须在这个额外的步骤中重新解释,除非有一个原因你不能(例如GA输入这些命令时没有GA加载的情况)。 –

回答

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),改变window参考b

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

相关问题