为什么我不能在定义对象时在(JavaScript)Worker中使用它?

时间:2011-12-18 17:44:56

标签: javascript html5 inheritance web-worker prototype-programming

来自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引用混乱。

谢谢!

1 个答案:

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

再次感谢。