来自Java(OOP)世界,我习惯于类,继承和多线程。现在,对于我在JavaScript域中的小步行,我尝试在适用的情况下使用这些范例和模式。阅读:使用原型("类" /对象)和WebWorkers进行并行执行。但是,这一个案例不起作用......
启动工作人员的HTML网站:
<html>
<head>
<script>
var worker = new Worker("worker.js");
worker.onmessage(event) {
// here be fancy script
}
worker.postMessage("run, worker, run!");
</script>
</head>
...
</html>
HTML调用的工作者(&#34; worker.js&#34;):
self.loadScripts("handler.js");
var handler = null;
self.onmessage = function(event) {
if(!handler) {
handler = new Handler();
}
handler.compute();
}
由工人调用的处理程序(&#34; handler.js&#34;):
function Handler() {
}
Handler.prototype = {
compute: function() {
this.doSomething(); // <-- ERROR! "this" points to the worker context,
// not to the Handler instance. So "doSomething" is
// undefined. However, the following line would work:
// Handler.prototype.doSomething();
},
doSomething: function() {
// More code here
}
}
JavaScript原型设计和&#34;继承&#34;意味着这样工作?我应该总是使用原型属性而不是这个吗?如果我想访问this.myProperty而不是函数怎么办?
另外:有没有合理的方法将它绑定到构造函数中的Handler实例?至少代码不会被冗长的Handler.prototype引用混乱。
谢谢!
答案 0 :(得分:0)
感谢您的评论。实际上,这种情况正如预期的那样起作用。真正的代码使用了超时回调:
Handler.prototype = {
compute: function() {
self.setTimeout(this.doSomething, 1000); // Here the this got lost
},
doSomething: function() {
// Code here
}
}
似乎这是从超时调用引用工作者上下文。为了解决这个问题,我只是将回调包装在一个匿名函数中(将调用者作为变量引用,如jfriend00建议的那样):
Handler.prototype = {
compute: function() {
var caller = this;
self.setTimeout(function() { // Wrap for great justice
caller.doSomething();
} , 1000);
}, doSomething: function() {
// Code here
}
}
再次感谢。