6

我正在尝试为具有昂贵初始化过程的对象编写 OO javascript,该过程将在完成时回调函数。

问题是调用者需要在回调例程中使用同一个对象的函数,而该对象还不存在:

// ctor for foo object
function foo(callback) {

    // do slow initialization here..

    // callback when done
    callback();
};

foo.prototype = function() {

    return {
        // doStuff method
        doStuff: function() {
          alert('stuff done');
        }
    };        
}();

// instantiate the foo object, passing in the callback
var f = new foo(function() {

    //Uncaught TypeError: Cannot call method 'doStuff' of undefined 
    f.doStuff();

});​

jsFiddle 我在这里错过了什么?

4

3 回答 3

7

这应该是一个简单的修复。首先,确保调用回调时将this对象设置为当前对象

function foo(callback) {
    // do slow initialization here..

    callback.call(this);
};

然后调整你的回调方式

var f = new foo(function() {
    this.doStuff();
});​

这是你更新的小提琴

于 2012-12-22T04:05:57.127 回答
2

这就是它不起作用的原因:当 JavaScript 执行代码时,在它可以 set 之前f,它需要计算new foo(...)表达式。在构造函数内部,它调用回调。JavaScript 仍未设置f,因为表达式尚未完成。一旦构造函数完成,f设置正确,但它永远不会到达那里,因为您尝试f在回调内部使用它仍然是undefined.


您可以通过事件循环在下一次迭代中调用回调,而不是:

callback();

你会这样做:

setTimeout(callback, 0);

不过,这仅在您已经假设它异步完成时才有效。

于 2012-12-22T04:07:23.140 回答
2

您的方法是内在问题。在构造函数中定义 doStuff。这样的调用:

var f = new Foo();
f.doStuff();

您还可以创建一个 init 方法,以便在创建新对象时运行。但是,您应该在构造函数的范围内执行此操作......不要将回调传递给构造函数。

于 2012-12-22T04:09:48.483 回答