在postMessage()之后恢复原型方法

时间:2017-05-29 09:41:43

标签: javascript prototype web-worker

我有以下JavaScript对象:

function Node() {
    this.id       = 0;
    this.parent   = null;
    this.children = [];
}
Node.prototype.toString = function() {
    return "ID: " + this.id;
};

以下是一个如何使用的示例:

var node = new Node();
node.id = 1;
node.parent = new Node();
parent.children.push(node);
node.toString();         // returns "ID: 1"

现在我遇到以下问题:

上面的示例代码在Web worker中执行 - 因此在那里创建节点。之后,我使用postMessage()将节点发送到主线程。

JavaScript会自动创建对象的深层副本。但是 - 当然 - 当这样做时,它会创建一个普通的JavaScript对象,而不是从Node继承它的属性的对象。因此,无法在主线程中调用toString()函数。

恢复节点的最简单,最高效的方法是什么,以便我的原型方法再次可用?这应该在我从Web worker收到对象后在主线程中完成。

理想情况下,应该在不创建数据的另一个副本的情况下完成,因为它可能包含大量节点并且还有循环。

我的解决方法是放弃原型方法,而是将节点作为参数传递给自由函数。但这不是一件好事。

1 个答案:

答案 0 :(得分:0)

然后定义你的protos并将它们添加到收到的节点,如:

let proto = node => { return {toString: () => 'ID: ' + node.id}}
let node = new Node();
node = Object.assign(node, proto(node));