我试图为具有昂贵的初始化过程的对象编写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 我在这里缺少什么?
答案 0 :(得分:7)
这应该是一个简单的修复。首先,确保在this
对象设置为当前对象
function foo(callback) {
// do slow initialization here..
callback.call(this);
};
然后调整你的回调方式
var f = new foo(function() {
this.doStuff();
});
这是你的updated fiddle
答案 1 :(得分:2)
这就是为什么它不起作用:当JavaScript执行代码时,在设置f
之前,它需要评估new foo(...)
表达式。在构造函数内部,它调用回调。由于表达式尚未完成,因此JavaScript仍未设置f
。构造函数完成后,f
设置正确,但它永远不会到达,因为当它仍然是f
时,你会尝试在回调中使用undefined
。
您可以通过事件循环在下一次迭代中调用回调,而不是:
callback();
你会这样做:
setTimeout(callback, 0);
这只有在您已经假设它异步完成时才会起作用。
答案 2 :(得分:2)
您的方法是内在问题。在构造函数中定义doStuff。这样的电话:
var f = new Foo();
f.doStuff();
您还可以创建一个init方法,以便在创建新对象时运行。但是,您应该在构造函数的范围内执行此操作...不要将回调传递给构造函数。