简单地说,我试图在web工作者中建立一个函数的原型,而is正在抛出这个错误:
Uncaught TypeError: Object #<DedicatedWorkerContext> has no method 'compute'
我认为需要一些示例代码。这是我的工作一天的结束,所以我要把这件事做得很快。整个下午我都在唠叨。我希望这是我明天早上回来说“啊-哈”的问题之一,但在偶然的机会下,我想我也会在这里问。
page.js
function threaded() {
var thread = new Worker('worker.js');
thread.postMessage({a: 1 b: 2});
thread.onMessage = function (e) {
console.log(e.data)
});
}
threaded();worker.js
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)
};我还尝试以不同的方式将foo()包含在onmessage中,但收到了以下错误:
Uncaught TypeError: Cannot set property 'a' of undefined
worker-take2.js
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)
};发布于 2014-02-19 23:38:11
问题是您正在执行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。
试试看!
https://stackoverflow.com/questions/21894932
复制相似问题