在 postMessage() 之后恢复原型方法
Restore prototype methods after postMessage()
我有以下 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 收到对象后在主线程中完成。
理想情况下,它应该在不创建数据的另一个副本的情况下完成,因为它可能包含很多节点并且也有循环。
我的解决方法是放弃原型方法,而是将节点作为参数传递给自由函数。但这不是一件好事。
之后定义你的原型并将它们添加到接收到的节点,如:
let proto = node => { return {toString: () => 'ID: ' + node.id}}
let node = new Node();
node = Object.assign(node, proto(node));
我有以下 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 收到对象后在主线程中完成。
理想情况下,它应该在不创建数据的另一个副本的情况下完成,因为它可能包含很多节点并且也有循环。
我的解决方法是放弃原型方法,而是将节点作为参数传递给自由函数。但这不是一件好事。
之后定义你的原型并将它们添加到接收到的节点,如:
let proto = node => { return {toString: () => 'ID: ' + node.id}}
let node = new Node();
node = Object.assign(node, proto(node));