Tho*_*ert 2 javascript node.js socket.io
我Character在同一个 js 文件中创建了一个由客户端和服务器共享的类。
服务器实例化这些字符并将它们存储在一个characterList对象中。我使用 将其发送给客户端socket.emit( 'updated_characters', characterList ),但客户端返回的是 的对象Object,而不是 的对象Character,因此我无法对它们使用我的角色方法。
我怎样才能解决这个问题?
您不能直接使用 socket.io 发送自定义对象类型。socket.io 使用 JSON 作为对象的传输格式,而 JSON 没有记录或重建自定义对象类型的能力。
因此,您需要做的是为您的对象创建一个序列化格式(也可能是 JSON),然后当您在另一端读取数据时,您将在自己的代码中构造一个自定义对象,然后将其传递构造函数中的此数据将从中初始化自身。
执行此操作的规范方法是为您的自定义对象创建一个序列化方法,该方法创建一个新的普通对象,该对象包含需要通过网络发送的所有相关信息,并且不包含对其他对象的引用(因为不能序列化)。请记住,对象通常具有不一定需要发送到另一端的内务处理信息。然后,为您的自定义对象创建一个初始化方法,该方法可以获取此序列化数据并正确初始化您可以在另一端使用的对象。
这是一个简单的例子:
function MyObject(data) {
if (data) {
this.init(data);
} else {
this.count = 0;
this.greeting = "hello"
}
}
MyObject.prototype = {
init: function(data) {
this.greeting = data.greeting;
this.count = data.count;
},
getData: function() {
return {greeting: this.greeting, count: this.count};
},
talk: function() {
say(this.greeting);
}
};
Run Code Online (Sandbox Code Playgroud)
然后,在事物的发送端,如果您在 中有一个对象实例item,您将使用以下命令发送数据:
socket.emit('updated_characters', item.getData());
Run Code Online (Sandbox Code Playgroud)
而且,在事情的接收方,你会有这样的:
socket.on('updated_characters', function(data) {
var item = new MyObject(data);
// do something with the item here
});
Run Code Online (Sandbox Code Playgroud)