我在玩网络 worker 。我有一些中等大小的数据对象,这些对象的操作需要花费相当多的时间。 Web Workers 似乎是并行化这些操作的好方法,但我发现很难选择将它们传递给 Web Worker 的最佳方式。 Web worker 可以对对象进行序列化和反序列化,但这会使它们失去类方法。我当然很想用他们的方法。
问题是处理重新附加方法的好方法是什么?很明显,我们可以将方法复制到传入的对象上,但这意味着我们知道我们得到了什么样的对象。使事情变得更加困难的是,某些对象包含其他类的数据,这意味着我们需要将方法重新附加到这些对象上。首先想到的是为每个以 JSON 对象作为参数的类实现一个替代构造函数。然后,备用构造函数可以递归地调用任何数据成员的 JSON 构造函数。
然后就是一开始如何选择正确的构造函数的问题 我想到的方法包括:
- 为每个类(class)实现不同的网络 worker (尴尬)
- 实现调用正确构造函数的工厂方法,(暗示我在发送之前直接指定发送对象的类)(更好,但仍然很尴尬)
- 实现一些类型猜测函数来确定顶级对象是哪个类。 (-_-)
有人有更好的主意吗?
最佳答案
显然,我真正需要做的就是理解 Javascript 的 __proto__
属性。这可以在将对象传递给 Web Worker 或从本地存储检索后重新建立对象的类方法的可用性。
function reattachMethods(serialized,originalclass) {
serialized.__proto__ = originalclass.prototype;
}
上述某些解决方案的问题在于,即使您已经拥有格式正确的所有数据,您最终还是要重新制作/复制对象。如果你有一个包含 n 个元素的对象,那么在 n 个对象被序列化并从浏览器发送到 web worker 之后,需要将 n 个元素复制到新对象中。这显然不理想。双下划线 proto 是一项非标准功能,已在所有主要浏览器中实现,并已作为下一个 javascript 标准的一部分宣布。
EDIT 2022:现代答案
虽然上述内容适用于 2013 年,但自那时以来,JavaScript 语言已经有了很多更新。如果您今天正在尝试相同的操作,现在建议使用语言提供的方法。 __proto__
已被弃用,现在不鼓励使用它。
特别是,Object.getPrototypeOf(object)
和 Object.setPrototypeOf(object, prototype)
接管了这个 Angular 色。
class LNode {
constructor(value, next = null) {
this.value = value;
this.next = next;
}
size() {
return 1 + (this.next === null ? 0 : this.next.size());
}
}
let test = new LNode(1, new LNode(2));
test.size(); //2
Object.getPrototypeOf(test); //{constructor: ƒ, size: ƒ}
let bareLinkedList = {value: 1, next: {value: 2, next: null}};
bareLinkedList.size //undefined
Object.setPrototypeOf(bareLinkedList, LNode.prototype);
Object.setPrototypeOf(bareLinkedList.next, LNode.prototype);
bareLinkedList.size(); //2
关于javascript - 优雅地将方法重新附加到 Web Worker 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15560518/