Javascript 我需要实现什么接口来允许对象通过WebWorker';什么是邮递信息?

Javascript 我需要实现什么接口来允许对象通过WebWorker';什么是邮递信息?,javascript,interface,web-worker,Javascript,Interface,Web Worker,在javascript中,您可以使用浏览器中的worker.postMessage和worker中的postMessage在工作线程和主线程之间传递对象 我一直在玩,不仅postMessage传递了数组和对象,甚至还传递了RegExp实例,所以我假设这些对象实现了一些接口。例如,对于字符串转换,可以实现.toString方法: "" + {toString: function() {return "Hello world!"}}; //prints `Hello world!` JSON.st

在javascript中,您可以使用浏览器中的
worker.postMessage
和worker中的
postMessage
在工作线程和主线程之间传递对象

我一直在玩,不仅
postMessage
传递了数组和对象,甚至还传递了RegExp实例,所以我假设这些对象实现了一些接口。例如,对于字符串转换,可以实现
.toString
方法:

"" + {toString: function() {return "Hello world!"}}; //prints `Hello world!`
JSON.stringify({toJSON: alert});
//Throws `TypeError: 'alert' called on an object that does not implement interface Window.`
//  - demonstrating that toJSON is being called
类似地,您可以实现
toJSON
方法:

"" + {toString: function() {return "Hello world!"}}; //prints `Hello world!`
JSON.stringify({toJSON: alert});
//Throws `TypeError: 'alert' called on an object that does not implement interface Window.`
//  - demonstrating that toJSON is being called
我的问题是,我应该为
postMessage
实现什么才能让我的
Player
类通过通信通道:

function Player(name) {
  this.name = name;
}
Player.prototype = Object.create(EventEmitter2.prototype);

我特意在这里添加了继承部分——我需要对象保持某种东西的实例,而不仅仅是数据持有者。就像使用
RegExp
一样,我需要通过我定义的一个或多个方法来重构它——如果在新范围中没有定义所需的上下文(类型定义,例如
EventEmitter2
),则必须失败。

唉,您不能。您不能指定自己的序列化器/反序列化器(或封送器/反封送器)。不过,您可以保留对象结构,这在大多数情况下已经足够好了,但构造函数和函数之类的信息不会传递

我是这样知道的:

规范中负责web工作人员的
postMessage
(顺便说一句,它与窗口的
postMessage
相同)的部分可以在这里找到:

这是很多无趣的技术内容,但重要的是:

让message clone作为获取消息参数[…]的结构化克隆的结果

结构化克隆算法如下所示:

正如你所看到的,情况看起来相当严峻。它检查内置对象和值(如Number或Blob),并相应地构造它们。可以传递任意对象,但只保留其结构


那么,你能做什么

  • 接受它。只有数据才能通过,就像JSON一样,只有更有限的数据才能通过。事实上,这并不是那么糟糕,它鼓励了传输层和实现的分离
  • 实现自己的封送拆收器、包装
    postMessage
    等。事实上,这并不太难,而且是一个很好的练习
  • 痛哭。我喜欢这个选项,它有助于处理日常生活

  • 谢谢你的回答。我肯定会给你+1,但我会在接受之前花点时间,以防有人会提出更多关于解决办法的想法。事实证明,出于性能原因,我当前的项目将只发送几个数字和字符串,并在两侧创建所有伪类实例。在另一个项目中,我可能只创建自己的序列化层。