gpt4 book ai didi

javascript - 优雅地将方法重新附加到 Web Worker 中的对象?

转载 作者:行者123 更新时间:2023-11-28 00:10:24 25 4
gpt4 key购买 nike

我在玩网络 worker 。我有一些中等大小的数据对象,这些对象的操作需要花费相当多的时间。 Web Workers 似乎是并行化这些操作的好方法,但我发现很难选择将它们传递给 Web Worker 的最佳方式。 Web worker 可以对对象进行序列化和反序列化,但这会使它们失去类方法。我当然很想用他们的方法。

问题是处理重新附加方法的好方法是什么?很明显,我们可以将方法复制到传入的对象上,但这意味着我们知道我们得到了什么样的对象。使事情变得更加困难的是,某些对象包含其他类的数据,这意味着我们需要将方法重新附加到这些对象上。首先想到的是为每个以 JSON 对象作为参数的类实现一个替代构造函数。然后,备用构造函数可以递归地调用任何数据成员的 JSON 构造函数。

然后就是一开始如何选择正确的构造函数的问题我想到的方法包括:

  1. 为每个类(class)实现不同的网络 worker (尴尬)
  2. 实现调用正确构造函数的工厂方法,(暗示我在发送之前直接指定发送对象的类)(更好,但仍然很尴尬)
  3. 实现一些类型猜测函数来确定顶级对象是哪个类。 (-_-)

有人有更好的主意吗?

最佳答案

显然,我真正需要做的就是理解 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

Object.getPrototypeOf
Object.setPrototypeOf
object.proto

关于javascript - 优雅地将方法重新附加到 Web Worker 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15560518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com