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

标签 javascript html design-patterns web-worker

我在玩网络 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/

相关文章:

javascript - Angular ng-bind-html - 防止执行 JS 代码

javascript - Webextension鼠标点击命令API(鼠标点击快捷键)?

java - 使用 Jsoup 访问 HTML 但收到错误代码 503

css - 不设置div宽度显示div overflow-x滚动条?

java - JNDI 作为服务定位器设计模式是否不好?

java - 在java中初始化Complex类

javascript - 不寻常的响应表功能

javascript - java而不是cordova元素中的html、css和js

html - 只滚动内容div,其他的应该是固定的

java - 使用装饰器模式时如何保留接口(interface)?