当Socketio调用JSON.stringify时,原型方法消失

时间:2017-03-13 06:15:22

标签: javascript json serialization socket.io

我正在尝试使用socketio在其原型上发送方法的对象。但是当socketio内部调用JSON.stringify时,这些方法会消失。我目前的想法真的很乏味,似乎不正确。我目前的解决方案如下。有没有更好的方法呢?

/* ServerSide */

// Constructor Function
function Cons() {
  this.prop = 'property'
}
// Method on the prototype
Cons.prototype.func = function() {
  console.log('called')
}


io.on('connection', socket => {
  let obj =  new Cons() 
  obj = putMethodsOnTheObject(obj)
  obj = stringifyMethods(obj)
  io.emit('randomEvent', obj)
}

function putMethodsOnTheObject(obj) {
    for(let i in obj) {
        if(!obj.hasOwnProperty(i)) {
            obj[i] = obj[i]; 
        }
    }
    return obj
}

function stringifyMethods(obj) {
 // Possibly toString each function and do some parsing?
}


/* ClientSide */

socket.on('randomEvent', obj => {
  obj = deStringifyMethods(obj) 
  console.log('obj: ', obj) 
}

function deStringifyMethods(obj) {
 // Possibly create a new function object for each func that was
 // converted to a string? like new Function(...)
}

1 个答案:

答案 0 :(得分:0)

看起来你没有阻止我的socket.io问题,实际上你似乎被javascript stringify问题阻止了:JSON.stringify不包括函数stringify,它只是字符串化值成员。

我发现第三方lib可以帮助字符串化函数:https://www.npmjs.com/package/json-fn,使用相同的lib,服务器中的stringify和客户端中的parse。我还没有用过,试一试,我认为这可以解决你的问题。

e.g。在服务器端:

let jsonfn = require('json-fn')
let obj =  new Cons() 
obj = putMethodsOnTheObject(obj)
obj = jsonfn.stringify(obj)
io.emit('randomEvent', obj)
祝你好运