我有一个这样的对象:
function A(id) {
this.id = id;
}
A.prototype.getId = function() {
return this.id;
}
它作为文件(“objects.js”)包含在 html 页面中,也包含在带有 importScript(“objects.js”)的网络 worker 中。 现在,我使用“var a = new A()”在 html 页面中创建一个 A 实例,并使用“postMessage()”将其发布到 Web Worker。
有趣的是,在 worker 中它仍然具有属性“id”及其值,但原型(prototype)函数丢失了。 我猜原因可能是原型(prototype)函数“绑定(bind)”到 html-page 上下文而不是 web worker 上下文。
所以我在 worker 中做的是:
event.data.a.__proto__ = A.prototype;
它正在工作,我将其视为某种 Actor ...
现在我的问题是,这是否是唯一有效的方式,或者是否有更好的方式将具有原型(prototype)函数的对象发布给网络 worker 。 对象定义在两种上下文中都可用...
最佳答案
structure clone algorithm用于在将数据发送给 web worker 之前序列化数据的方法不会遍历原型(prototype)链(有关详细信息,请参阅 § 2.7.5 Safe passing of structured data )。这解释了为什么不保留派生函数。
除了像您那样手动恢复对象外,您还可以创建一个具有原型(prototype)函数的新对象,并使用Object.assign。从接收到的对象复制属性。
请注意,这两种变通方法都假定原型(prototype)对象及其函数为 web worker 所知。一般而言,没有在保留函数的同时传输任意对象的自动方法(请参阅我的 answer 至 this related question 关于发送带有函数的对象)。
关于javascript - 将 Javascript 对象传递给 Web Worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15360810/