Webworkers中的类

时间:2018-04-17 17:55:46

标签: javascript web-worker

主线程JS和webworker之间可以传递什么,不能传递什么?

我在webworker中有一个JS类,我想将它传递给他们的主线程。做这个的最好方式是什么?有没有办法将JSON对象映射到类或者我是否需要为此创建一个特殊的构造函数?

class HelloWorld{
    constructor(message){
        this.msg = message
    }
    getMessage(){
        debugger
        return this.msg;
    }
}
var a = new HelloWorld("hello WorlD")
postMessage(a)

主线程将其读作`{msg:“hello WorlD”} strippign所有成员数据和数据类型。

1 个答案:

答案 0 :(得分:0)

标准答案是structured clone algorithm

对于专门发送类实例的情况:

1-使用console.log(a)将其显示为JS对象时显示如下内容:

{
  msg: "hello WorlD",
  __proto__: {
    constructor: ...,
    getMessage: ...,
    __proto__: {...}
  }
}

即,对于一个足够简单的类:可以近似说实例属性是普通对象属性,实例函数是__proto__属性上的属性。

2-在structured clone algorithm之后:将传递msg,但不会传递成员函数getMessage,因为“原型链不会被复制。”。

3-如果成员函数不是原型链的一部分,而是直接定义为对象原型,则由于无法发送Function对象,整个对象传递都会失败。
例如,如果您尝试:a.getMessage2 = function() {return 7;},则整个对象甚至都不会被传递。

4-我不知道您在这里使用typeof是什么意思,但是如果您是使用messageEvent.data instanceof HelloWorld,那么这里的问题是主代码/线程不包含网络代码,工作文件,因此不了解HelloWorld定义。
为了使它们都可以看到HelloWorld,您可以在两个文件中都定义该类,或者(1)在一个外部文件中定义它(例如hello-world.js),(2)然后将其导入到主文件中通过在HTML中添加<script src="hello-world.js">来添加代码/线程,并(3)通过在Web-worker文件的开头添加importScripts('hello-world.js')将其导入到Web-worker代码中。

免责声明:我在课堂上不是很了解。我对类实例如何(以及可以)被视为JS对象使用了一些可能真实的假设。