2

Java (OOP) の世界から来た私は、クラス、継承、およびマルチスレッドに慣れています。JavaScript ドメインでのちょっとしたウォークアバウトとして、これらのパラダイムとパターンを適宜利用してみます。読む: 並列実行にはプロトタイプ (「クラス」/オブジェクト) と WebWorker を使用します。ただし、この1つのケースは機能しません...

ワーカーを開始する 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 参照で雑然としていません。

ありがとう!

4

1 に答える 1

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
    }
}

再度、感謝します。

于 2011-12-19T12:53:27.023 に答える