从存储在对象中的回调调用函数,在数组中

时间:2016-10-11 22:07:43

标签: javascript canvas

基本上我想做的就是能够调用一个对象中引用的函数,无论出于何种原因我遇到了重大问题,chrome上的错误是: Uncaught TypeError: obj.draw is not a functionrender @ main.js:46main @ main.js:16也许这意味着它是私人的?我不确定,无论如何这里是一个MVCE

var bullets = [];
bullets.push(bullet)

;(function() // I know this is a little overkill for an mvce
{
  function main()
  {
    window.requestAnimationFrame( main );
    render();
  }
  main();
})();

function bullet()
{
  this.x = canvas.width/2;
  this.y = canvas.height/2;
  this.move = function()
  {
    ++this.y;
  };
  this.draw = function()
  {
    ctx.beginPath();
    ctx.rect(this.x, this.y, 5, 10);
    ctx.closePath();
    ctx.stroke();
  };
}


function render()
{
  for( let obj of bullets )
      obj.draw();
}

1 个答案:

答案 0 :(得分:2)

你正在推动一个类,但是调用了一个对象的功能。这里bullet是一个类,而不是它的实例化。只有实例化的变量才具有该功能。将您的代码更改为:

bullets.push(new bullet());

并将函数声明放在顶部。 (没必要)。



var bullets = [];
bullets.push(new bullet())

;(function() // I know this is a little overkill for an mvce
{
  function main()
  {
    window.requestAnimationFrame( main );
    render();
  }
  main();
})();

function bullet()
{
  this.x = canvas.width/2;
  this.y = canvas.height/2;
  this.move = function()
  {
    ++this.y;
  };
  this.draw = function()
  {
    ctx.beginPath();
    ctx.rect(this.x, this.y, 5, 10);
    ctx.closePath();
    ctx.stroke();
  };
}


function render()
{
  for( let obj of bullets )
      obj.draw();
}




以上代码抛出canvas未定义,这是代码段的预期。希望这会有所帮助。