简单地说,我正在尝试在web worker中对函数进行原型设计,并且chrome正在抛出此错误:
Uncaught TypeError: Object #<DedicatedWorkerContext> has no method 'compute'
我想要一些示例代码。这是我工作日的结束,所以我很快就把它扔到了一起。整个下午都让我难以置信。我希望明天早上我回来的其中一个问题是“啊哈哈”但是我不会有机会,我想我也会在这里问。
function threaded() {
var thread = new Worker('worker.js');
thread.postMessage({a: 1 b: 2});
thread.onMessage = function (e) {
console.log(e.data)
});
}
threaded();
var foo = function(a,b) {
this.a = a
this.b = b
this.result = false;
this.compute();
};
foo.prototype.compute = function() {
this.result = this.a * this.b;
};
onmessage = function(e) {
var msg = foo(e.data.a,e.data.b)
postMessage(msg)
};
我还尝试过不同的方法来调整worker.js,以便在onmessage中包含foo(),如下所示,但收到以下错误:
Uncaught TypeError: Cannot set property 'a' of undefined
onmessage = function(e) {
var foo = function(a,b) {
this.a = a
this.b = b
this.result = false;
this.compute();
};
foo.prototype.compute = function() {
this.result = this.a * this.b;
};
var msg = foo(e.data.a,e.data.b)
postMessage(msg)
};
答案 0 :(得分:4)
问题是您正在执行foo
,而不是声明new
实例。因此,this
上下文中的foo
计算为专用工作者上下文,而不是对象实例上下文。
试试这个:
var foo = function(a,b) {
this.a = a
this.b = b
};
foo.prototype.compute = function() {
return this.a * this.b;
};
onmessage = function(e) {
var msg = new foo(e.data.a,e.data.b).compute();
postMessage(msg)
};
需要注意一些重要的变化。首先,我更改了compute
以返回结果,而不是将其设置为属性。请记住,使用prototype
时,您将显式创建跨对象实例共享的方法,从而暗示您以面向对象的方式使用该代码。
其次,我更改了foo
的构造函数,以便它不会立即调用compute
。相反,在声明对象实例后调用compute
。
尝试一下!