如何在Socket.IO中传递JavaScript中的"新"对象

Bre*_*rty 3 javascript json node.js socket.io

我正在尝试将对象从一个客户端传递到另一个客户端,例如多人棋盘游戏中的棋子.我有使用工作的解决方案JSON.parser__proto__,但我很好奇,想知道是否有更好的方法.

客户发送:

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

服务器将该片段转发给其他人:

client.broadcast(piece);
Run Code Online (Sandbox Code Playgroud)

另一位客户收到:

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

这是我使用的最后一步,我__proto__担心我可能会在脚下射击自己.有更好的建议吗?

Ray*_*nos 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;
}
Run Code Online (Sandbox Code Playgroud)

首先toJSON在对象上使用该方法允许JSON.stringify立即将对象转换为JSON.这是JSON API的一部分.toJSON如果方法存在,JSON API将调用该方法并将该对象转换为JSON.

这基本上允许您根据需要序列化对象.

第二部分是添加一个工厂方法作为构造函数的属性,它接收序列化的JSON数据并创建一个新的元件.然后它会将您的序列化数据注入该板件对象.

因此,您只序列化您关心的数据,然后通过工厂方法传递该数据.这是将自定义对象从一个客户端发送到另一个客户端的最佳方法.