我有一个像这样的对象:
function A(id) {
this.id = id;
}
A.prototype.getId = function() {
return this.id;
}
它作为文件(“objects.js”)包含在html页面中,并且包含在带有importScript(“objects.js”)的web worker中。 现在我在html页面中使用“var a = new A()”创建一个A实例,并将其与“postMessage()”一起发布给Web Worker。
有趣的是,在worker中它仍然具有属性“id”及其值,但原型函数丢失了。 我想原因可能是原型函数被“绑定”到html-page上下文而不是web worker上下文。
所以我在工作中所做的是:
event.data.a.__proto__ = A.prototype;
它正在工作,我认为它是某种演员......
现在我的问题是,如果这是唯一且有效的方式,或者是否有更好的方法将具有原型函数的对象发布给Web worker。 对象定义在两种情况下都可用......
答案 0 :(得分:2)
在将数据发送给Web worker之前用于序列化数据的structure clone algorithm不会遍历原型链(有关详细信息,请参阅§ 2.7.5 Safe passing of structured data)。这就解释了为什么不保留派生函数。
除了像您一样手动恢复对象之外,您还可以创建一个具有原型函数的新对象,并使用Object.assign从接收到的对象中复制属性。
请注意,这两种解决方法都假定Web工作者已知原型对象及其功能。通常,在保留函数的同时没有自动传输任意对象的方法(请参阅我的answer到this related question关于发送带函数的对象)。
答案 1 :(得分:1)
网络工作者的规范不允许传递任何字符串。
Here是一个关于此的问题。
因此,您应该使用(例如)json序列化对象数据,然后在另一侧对其进行反序列化,从而在Webworker中创建具有相同数据的对象的新实例。
可以使用相同的方法将对象再次传回 - 但它们都必须知道如何创建,序列化和反序列化A
类型的对象。