如何通过“新”考试? Socket.IO 中的 JavaScript 对象

发布于 2024-11-04 17:29:54 字数 563 浏览 1 评论 0原文

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

客户端发送:

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__ 的最后一步,我担心我可能会搬起石头砸自己的脚。有更好的建议吗?

I'm trying to pass objects from one client to another client, e.g. pieces in a multiplayer board game. I have a working solution using JSON.parser and __proto__, but I'm curious to know if there is a better way.

Client sends:

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

Server forwards the piece to others:

client.broadcast(piece);

Another client receives:

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

It's the last step where I use __proto__ that I'm concerned I may be shooting myself in the foot. Is there a better suggestion?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

放飞的风筝 2024-11-11 17:29:54
// 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。然后它会将序列化的数据注入到该 boardpiece 对象中。

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

// 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;
}

Firstly using the toJSON method on your objects allows JSON.stringify to immediatly convert your object to JSON. This is part of the JSON API. The JSON API will call the toJSON method if it exists and converts that object to JSON.

This basically allows you to serialize your object as and how you want.

The second part is adding a factory method as a property of your constructor which takes your serialized JSON data and creates a new boardpiece. It will then inject your serialized data into that boardpiece object.

So your serializing only the data you care about and then passing that data through a factory method. This is the best way to send custom objects from one client to another.

℉絮湮 2024-11-11 17:29:54

有很多用于节点的对象同步项目可能会让生活变得更轻松。对于初学者,请查看:

There are a bunch of object syncing projects for node that might make life easier. For starters, check out:

在风中等你 2024-11-11 17:29:54

你尝试过 jQuery 的 $.extend() 方法吗? http://api.jquery.com/jQuery.extend/

Have tou tried jQuery's $.extend() method? http://api.jquery.com/jQuery.extend/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文