2

来自 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 调用的 Worker(“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 而不是函数怎么办?

另外:是否有任何合理的方法可以将 this 绑定到构造函数中的 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 回答