2
来自Java(OOP)世界,我习惯于类,继承和多线程。现在,我在JavaScript领域的一些小动作,我尝试在适用的情况下使用这些范例和模式。阅读:使用原型(“类”/对象)和WebWorkers进行并行执行。然而,这一种情况下不工作...为什么我不能在定义对象时在(JavaScript)Worker中使用它?
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调用( “worker.js”):
self.loadScripts("handler.js");
var handler = null;
self.onmessage = function(event) {
if(!handler) {
handler = new Handler();
}
handler.compute();
}
的处理程序(“handler.js”):
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原型和“继承”是否意味着以这种方式工作?我应该总是使用原型属性来代替这个吗?如果我想访问this.myProperty而不是函数呢?
另外:是否有任何合理的方式将其绑定到构造函数中的Handler实例?至少代码不会与冗长的Handler.prototype引用混淆。
谢谢!
我认为你需要[传递上下文](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call),否则'this'会引用任何全局范围。 – 2011-12-18 17:50:07
对我来说似乎它应该工作(尽管我对WebWorkers不太熟悉)。我们是否缺少任何相关的代码? 'compute'函数中的'this'应该是它被调用的'handler'对象。 – RightSaidFred 2011-12-18 17:53:11
我建议你首先确保代码在网络工作者之外工作,这样你就不会错过显而易见的东西。然后,把它放在一个网络工作者,并在那里测试。当你在一个对象上调用一个方法时,'this'应该被设置为对象,就像你期待的那样,所以代码中有一些不合适的地方(我目前没有看到)。 – jfriend00 2011-12-18 18:03:21