So übergeben Sie ein "neues" Objekt in JavaScript in Socket.io
-
28-10-2019 - |
Frage
Ich versuche, Objekte von einem Kunden an einen anderen Kunden zu übergeben, z. B. Stücke in einem Multiplayer -Brettspiel. Ich habe eine funktionierende Lösung mit Verwendung JSON.parser
und __proto__
, aber ich bin gespannt, ob es einen besseren Weg gibt.
Client sendet:
var my_piece = new BoardPiece();
// ... my_piece is assigned data, like x-y coordinates
socket.send(JSON.stringify(my_piece));
Server leitet das Stück an andere weiter:
client.broadcast(piece);
Ein anderer Client erhält:
var your_piece = JSON.parse(json);
your_piece.__proto__ = BoardPiece.prototype; // provide access to BoardPiece's functions
Es ist der letzte Schritt, in dem ich benutze __proto__
Ich mache mir Sorgen, dass ich mich in den Fuß schieße. Gibt es einen besseren Vorschlag?
Lösung
// 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;
}
Erstens mit dem toJSON
Methode auf Ihren Objekten erlaubt es JSON.stringify
Um Ihr Objekt sofort in JSON zu konvertieren. Dies ist Teil der JSON -API. Die JSON -API wird das anrufen toJSON
Methode, wenn es existiert und diese Objekte in JSON konvertiert.
Dies ermöglicht es Ihnen im Grunde, Ihr Objekt nach und wie Sie möchten.
Der zweite Teil besteht darin, eine Fabrikmethode als Eigenschaft Ihres Konstruktors hinzuzufügen, die Ihre serialisierten JSON -Daten nimmt und ein neues Boardpiece erstellt. Anschließend wird Ihre serialisierten Daten in dieses Boardpiece -Objekt eingerichtet.
Ihre Serialisierung nur die Daten, die Ihnen wichtig sind, und diese Daten dann über eine Fabrikmethode übertragen. Dies ist der beste Weg, um benutzerdefinierte Objekte von einem Client an einen anderen zu senden.
Andere Tipps
Es gibt eine Reihe von Objektsynchronisierungsprojekten für Knoten, die das Leben erleichtern könnten. Für den Anfang schauen Sie sich an:
Hat Tou JQuery's $ .EXTEND () -Methode ausprobiert? http://api.jquery.com/jquery.extend/