Java(OOP)の世界から来て、私はクラス、継承、マルチスレッドに慣れています。 JavaScriptドメインで少し歩いていたら、これらのパラダイムとパターンを適用してみましょう。読み込み:プロトタイプ(「クラス」/オブジェクト)とWebWorkersを並列実行に使用します。労働者を開始しかし、この1ケースは動作しません...オブジェクトを定義するときに(JavaScript)ワーカーでこれを使用できないのはなぜですか?
HTMLサイト:HTML( "worker.js")によって呼び出さ
<html>
<head>
<script>
var worker = new Worker("worker.js");
worker.onmessage(event) {
// here be fancy script
}
worker.postMessage("run, worker, run!");
</script>
</head>
...
</html>
ワーカー:
self.loadScripts("handler.js");
var handler = null;
self.onmessage = function(event) {
if(!handler) {
handler = new Handler();
}
handler.compute();
}
ハンドラとして
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/ja/JavaScript/Reference/Global_Objects/Function/call)。そうでなければ、 'this'はグローバルスコープが何であっても参照する。 –
私はそれがうまくいくように思えます(私はWebWorkersにあまり慣れていませんが)。関連するコードがありませんか? 'compute'関数の' this'は、呼び出された 'handler'オブジェクトでなければなりません。 – RightSaidFred
私はコードがWebワーカーの外で動作することを確認してから、何か明白なものを見逃さないようにすることをお勧めします。次に、Webワーカーに配置してテストします。オブジェクトのメソッドを呼び出すときには、 'this'をオブジェクトに設定して、期待しているようにコード内に何か問題があります(私は現時点では見ていません)。 – jfriend00