7

我有一个这样的对象:

function A(id) {
    this.id = id;
}

A.prototype.getId = function() {
    return this.id;
}

它作为文件(“objects.js”)包含在 html 页面中,也包含在带有 importScript(“objects.js”)的 web worker 中。现在,我使用“var a = new A()”在 html 页面中创建 A 的实例,并使用“postMessage()”将其发布到 Web Worker。

有趣的是,在 worker 中它仍然具有属性“id”及其值,但原型函数丢失了。我猜原因可能是原型函数被“绑定”到 html 页面上下文而不是 web worker 上下文。

所以我在工人中做的是:

event.data.a.__proto__ = A.prototype;

它正在工作,我认为它是某种演员......

现在我的问题是,这是否是唯一且有效的方法,或者是否有更好的方法将具有原型功能的对象发布给网络工作者。对象定义在两种情况下都可用...

4

2 回答 2

4

用于在将数据发送到 web worker 之前序列化数据的结构克隆算法不会遍历原型链(有关详细信息,请参阅第 2.7.5 节结构化数据的安全传递)。这就解释了为什么不保留派生函数。

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

请注意,这两种变通方法都假定原型对象及其功能对 Web Worker 是已知的。一般来说,在保留函数的同时,没有自动传输任意对象的方法(请参阅我对有关发送带有函数的对象的相关问题的回答)。

于 2017-07-10T22:31:23.327 回答
1

webworkers 规范不允许传递字符串以外的任何内容。

是一个关于这个的问题。

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

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

于 2013-03-12T12:16:22.707 回答