Javascript 将自定义对象列表从服务器发送到客户端

Javascript 将自定义对象列表从服务器发送到客户端,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我在同一个js文件中创建了一个由客户端和服务器共享的Character类 服务器实例化这些字符,并将它们存储在字符列表对象中。我使用socket.emit('updated_characters',characterList)将其发送给客户端,但客户端返回的对象是object,而不是Character,因此我无法对其使用我的角色方法 我该如何解决这个问题?您不能直接使用socket.io发送自定义对象类型。socket.io使用JSON作为对象的传输格式,JSON无法记录或重建自定义对象类型 因

我在同一个js文件中创建了一个由客户端和服务器共享的
Character

服务器实例化这些字符,并将它们存储在
字符列表
对象中。我使用
socket.emit('updated_characters',characterList)
将其发送给客户端,但客户端返回的对象是
object
,而不是
Character
,因此我无法对其使用我的角色方法


我该如何解决这个问题?

您不能直接使用socket.io发送自定义对象类型。socket.io使用JSON作为对象的传输格式,JSON无法记录或重建自定义对象类型

因此,您需要做的是为您的对象创建一个序列化格式(也可能是JSON),然后当您在另一端读取数据时,您将在自己的代码中构造一个自定义对象,然后将此数据传递到构造函数中,从中它将初始化自身

实现这一点的规范方法是为自定义对象创建一个序列化方法,该方法创建一个新的普通对象,该对象包含需要通过网络发送的所有相关信息,并且不包含对其他对象的引用(因为无法序列化)。请记住,对象通常具有不一定需要发送到另一端的内务管理信息。然后,为自定义对象创建一个initialize方法,该方法可以获取此序列化数据并正确初始化可在另一端使用的对象

下面是一个简单的例子:

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);
    }
};
然后,在事物的发送端,如果您在
项中有一个对象的实例,那么您将通过以下方式发送数据:

socket.emit('updated_characters', item.getData());
而且,在接收方面,你会有这样的结果:

socket.on('updated_characters', function(data) {
    var item = new MyObject(data);
    // do something with the item here
});

我们必须执行
JSON.stringify
,以便套接字识别为
JSON
,并在前端显示它,如果您可以包含您的代码,这将是一个很好的问题。尝试可能的副本
socket.emit( 'updated_characters', JSON.stringify(characterList) );