2013-05-18 59 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)); 
      }; 
      
    • 否則,你要麼使你的對象全局,其添加爲一個屬性到另一個對象。

相關問題