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引用混淆。

谢谢!

+0

我认为你需要[传递上下文](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call),否则'this'会引用任何全局范围。 – 2011-12-18 17:50:07

+0

对我来说似乎它应该工作(尽管我对WebWorkers不太熟悉)。我们是否缺少任何相关的代码? 'compute'函数中的'this'应该是它被调用的'handler'对象。 – RightSaidFred 2011-12-18 17:53:11

+0

我建议你首先确保代码在网络工作者之外工作,这样你就不会错过显而易见的东西。然后,把它放在一个网络工作者,并在那里测试。当你在一个对象上调用一个方法时,'this'应该被设置为对象,就像你期待的那样,所以代码中有一些不合适的地方(我目前没有看到)。 – jfriend00 2011-12-18 18:03:21

回答

0

感谢您的意见。事实上,这种情况正如预期般运作。真正的代码中使用超时回调:

Handler.prototype = { 
    compute: function() { 
     self.setTimeout(this.doSomething, 1000); // Here the this got lost 
    }, 
    doSomething: function() { 
     // Code here 
    } 
} 

看来这从超时呼叫引用工人的上下文。再次

Handler.prototype = { 
    compute: function() { 
     var caller = this; 
     self.setTimeout(function() { // Wrap for great justice 
      caller.doSomething(); 
      } , 1000); 
    }, doSomething: function() { 
     // Code here 
    } 
} 

感谢:为了解决这个问题,我只是包裹在一个匿名函数的回调(引用调用者的变量,jfriend00建议)。

相关问题