Как передать «новый» объект в JavaScript в Socket.IO - PullRequest
3 голосов
/ 03 мая 2011

Я пытаюсь передать объекты от одного клиента другому, например, фигуры в многопользовательской настольной игре. У меня есть рабочее решение с использованием 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__, что меня беспокоит, возможно, я стреляю себе в ногу. Есть ли лучшее предложение?

Ответы [ 3 ]

8 голосов
/ 03 мая 2011
// 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 и создает новую часть платы. Затем он вставит ваши сериализованные данные в этот объект платы.

Таким образом, вы сериализуете только те данные, которые вам нужны, а затем передаете эти данные фабричным методом. Это лучший способ отправки пользовательских объектов от одного клиента другому.

3 голосов
/ 05 мая 2011

Существует множество проектов синхронизации объектов для узла, которые могут упростить жизнь.Для начала, проверьте:

0 голосов
/ 03 мая 2011

Вы пробовали использовать метод jQuery $ .extend ()? http://api.jquery.com/jQuery.extend/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...