2011-05-03 15 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

相关问题