我想我错过了一些关于JavaScript中对象和原型函数的关键概念。为什么通过setTimeout调用原型函数时会丢失实例信息?
我有以下:
function Bouncer(ctx, numBalls) {
this.ctx = ctx;
this.numBalls = numBalls;
this.balls = undefined;
}
Bouncer.prototype.init = function() {
var randBalls = [];
for(var i = 0; i < this.numBalls; i++) {
var x = Math.floor(Math.random()*400+1);
var y = Math.floor(Math.random()*400+1);
var r = Math.floor(Math.random()*10+5);
randBalls.push(new Ball(x, y, 15, "#FF0000"));
}
this.balls = randBalls;
this.step();
}
Bouncer.prototype.render = function() {
this.ctx.clearRect(0, 0, 400, 400);
for(var i = 0; i < this.balls.length; i++) {
this.balls[i].render(this.ctx);
}
}
Bouncer.prototype.step = function() {
for(var i = 0; i < this.balls.length; i++) {
this.balls[i].yPos -= 1;
}
this.render();
setTimeout(this.step, 1000);
}
我然后创建蹦床的一个实例,并调用它的init函数,如下所示:
$(function() {
var ctx = $('#canvas')[0].getContext('2d');
var width = $('#canvas').width();
var height = $('#canvas').height();
var bouncer = new Bouncer(ctx, 30);
bouncer.init();
});
的init()函数将调用步骤,其具有的setTimeout循环步进功能。
这适用于第一次调用step()。但是,在第二次调用时(setTimeout触发一步时),实例变量“balls”未定义。所以,在我的step函数中,第二个调用会爆炸说没有未定义的“length”属性。
为什么从setTimeout()调用步骤时会丢失实例信息?
我怎么能重组这个,所以我可以通过超时循环,仍然可以访问这些实例变量?
击败了我20秒,并以一个整洁的例子来启动。做得好。 – Beejamin