电子-ipcRenderer.send()上的原型数据丢失

时间:2018-07-12 22:58:33

标签: javascript class oop electron prototype

我正在开发一个Electron应用程序,在该应用程序中,我需要通过ipcRenderer发送一个包含给定类对象的数组,并且我注意到这些对象会因此丢失所有原型数据。例如:

//js running on the browser
const {ipcRenderer} = require('electron');
class Thingy {
   constructor() {
      this.thingy = 'thingy'
   }
}
let array = [new Thingy(), 'another thing']
console.log(array[0] instanceof Thingy) // => true
console.log(array[0].constructor.name) // => 'Thingy'
console.log(array[0]) // => Thingy { this.thingy='thingy' }
ipcRendered.send('array of thingys', foo)

//app-side js
const {ipcMain} = require('electron');
ipcMain.on('array of thingys', (event, array) => {
    console.log(array[0] instanceof Thingy) // => false
    console.log(array[0].constructor.name) // => 'Object'
    console.log(array[0]) // => Object { this.thingy='thingy' }
})

这对我来说尤其重要,因为在那之后,我需要检查该数组的所有元素是否都是该特定类的实例:

ipcMain.on('array of thingys', (event, array) => {
    //if the array only contains objects of the class Thingy
    if (array.filter((elm) => {return !(elm instanceof Thingy)}).length == 0) {
        //do some stuff
    } else {//do some other stuff}
})

这是预期的行为吗?如果是这样,处理这种问题的最合适方法是什么?

1 个答案:

答案 0 :(得分:3)

https://electronjs.org/docs/api/ipc-renderer#ipcrenderersendchannel-arg1-arg2-

  

参数将在内部以JSON序列化,因此不包含任何函数或原型链。

IPC仅接受可序列化的对象。在进程之间比较实例没有简单易用的方法,因为它已经超出了运行时上下文的边界,因此比较实例没有太多意义。您可能需要以其他方式设计而不依赖实例类型。