我正在开发一个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}
})
这是预期的行为吗?如果是这样,处理这种问题的最合适方法是什么?
答案 0 :(得分:3)
https://electronjs.org/docs/api/ipc-renderer#ipcrenderersendchannel-arg1-arg2-
参数将在内部以JSON序列化,因此不包含任何函数或原型链。
IPC仅接受可序列化的对象。在进程之间比较实例没有简单易用的方法,因为它已经超出了运行时上下文的边界,因此比较实例没有太多意义。您可能需要以其他方式设计而不依赖实例类型。