2011-05-03 19 views
3

我試圖從一個客戶端傳遞對象到另一個客戶端,例如棋子在多人棋盤遊戲中。我有一個使用JSON.parser__proto__的工作解決方案,但我很想知道是否有更好的方法。如何在Socket.IO中通過JavaScript中的「新」對象

客戶端發送:

var my_piece = new BoardPiece(); 
// ... my_piece is assigned data, like x-y coordinates 
socket.send(JSON.stringify(my_piece)); 

服務器轉發一塊給別人:

client.broadcast(piece); 

另一個客戶端接收:

var your_piece = JSON.parse(json); 
your_piece.__proto__ = BoardPiece.prototype; // provide access to BoardPiece's functions 

這是最後一步,我使用__proto__我」我擔心我可能會在腳下開槍自殺。有更好的建議嗎?

回答

8
// clientone.js 

var piece = new BoardPiece(); 
// ... 
socket.send(JSON.stringify(piece)); 

// clienttwo.js 
var piece = BoardPiece.Create(JSON.parse(json)); 
... 

// BoardPiece.js 
function BoardPiece() { 

} 

BoardPiece.prototype.toJSON = function() { 
    var data = {}; 
    data.foo = this.foo; 
    ... 
    return data; 
}; 

BoardPiece.Create = function(data) { 
    var piece = new BoardPiece(); 
    piece.foo = data.foo; 
    ... 
    return piece; 
} 

首先使用toJSON方法對你的對象允許JSON.stringify給您立刻對象轉換爲JSON。這是JSON API的一部分。 JSON API將調用toJSON方法(如果它存在並將該對象轉換爲JSON)。

這基本上允許你序列化你的對象爲你想要的。

第二部分是添加一個工廠方法作爲你的構造函數的一個屬性,它接受你的序列化的JSON數據並創建一個新的boardpiece。然後它會將您的序列化數據注入到該板件對象中。

因此,您僅序列化您關心的數據,然後通過工廠方法傳遞該數據。這是將自定義對象從一個客戶端發送到另一個客戶端的最佳方式。

+0

非常感謝。這一切都是有道理的,我可以看到這種方式可以讓你過濾掉你想要發送和接收的屬性。但是,就我而言,我想要所有對象的屬性。所以如果我正確理解你,我不應該實現toJSON,它會JSON化我所有的屬性。這意味着如果我更改BoardPiece中的屬性,我將只有重複的Create代碼。 – 2011-05-04 03:23:48

+0

@BrentDaugherty你可以對整個對象進行jsonify,然後對for(var prop in obj){...}'循環對象並複製每個屬性。這個想法是你基本上增加了第二個構造函數,它接受另一個對象並創建一個克隆。這是OO中具有基於克隆的構造函數的常見構造。你甚至可以將它作爲構造函數的參數來處理,只能在那裏處理它。 – Raynos 2011-05-04 08:07:57

0

有試過jQuery的$ .extend()方法嗎? http://api.jquery.com/jQuery.extend/

+0

在文檔來看,目前還不清楚是否會考慮對象的原型。無論如何,我不想使用第三方庫;這是智能手機設備。 – 2011-05-03 15:31:41

3

有一堆節點的對象同步項目可能會使生活更輕鬆。對於初學者來說,退房:

+0

如果您不知道抽象如何特別工作,那麼通過抽象層共享對象可能會非常昂貴。Theres在500個週期之間有很大區別,以獲得對象的本地屬性和2.5億週期以獲得網絡中存在的對象的屬性。通常,當理解並使用像'now'這樣的良好抽象可以讓你的生活變得輕鬆。 – Raynos 2011-05-05 15:50:19

+0

謝謝。這些是我將包括的圖書館的一些很好的鏈接,因爲我更瞭解它們,事情變得更加複雜。 – 2011-05-09 16:58:36

相關問題