主线程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所有成员数据和数据类型。
答案 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对象使用了一些可能真实的假设。