将Javascript-Object传递给Web Worker

时间:2013-03-12 12:09:28

标签: javascript web-worker postmessage

我有一个像这样的对象:

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。 对象定义在两种情况下都可用......

2 个答案:

答案 0 :(得分:2)

在将数据发送给Web worker之前用于序列化数据的structure clone algorithm不会遍历原型链(有关详细信息,请参阅§ 2.7.5 Safe passing of structured data)。这就解释了为什么不保留派生函数。

除了像您一样手动恢复对象之外,您还可以创建一个具有原型函数的新对象,并使用Object.assign从接收到的对象中复制属性。

请注意,这两种解决方法都假定Web工作者已知原型对象及其功能。通常,在保留函数的同时没有自动传输任意对象的方法(请参阅我的answerthis related question关于发送带函数的对象)。

答案 1 :(得分:1)

网络工作者的规范不允许传递任何字符串。

Here是一个关于此的问题。

因此,您应该使用(例如)json序列化对象数据,然后在另一侧对其进行反序列化,从而在Webworker中创建具有相同数据的对象的新实例。

可以使用相同的方法将对象再次传回 - 但它们都必须知道如何创建,序列化和反序列化A类型的对象。