这是一个常规的构造函数吗?

时间:2013-05-30 09:39:05

标签: javascript html5 object canvas constructor

所以我一直在查看我下载过的游戏脚本。我不确定的是 Bullet(I)从未在脚本中实例化(即var x = new Bullet)。本教程将此称为构造函数。发生了什么事?

看起来Bullet构造函数正在获取参数并向其添加属性等。但是脚本中没有任何地方可以实例化Bullet - 所以它不可能?

var playerBullets = [];

    function Bullet(I) {
      I.active = true;
      I.xVelocity = 0;
      I.yVelocity = -I.speed;
      I.width = 3;
      I.height = 3;
      I.color = "#000";

      I.inBounds = function() {
        return I.x >= 0 && I.x <= CANVAS_WIDTH &&
          I.y >= 0 && I.y <= CANVAS_HEIGHT;
      };

      I.draw = function() {
        canvas.fillStyle = this.color;
        canvas.fillRect(this.x, this.y, this.width, this.height);
      };

      I.update = function() {
        I.x += I.xVelocity;
        I.y += I.yVelocity;

        I.active = I.active && I.inBounds();
      };

      I.explode = function() {
        this.active = false;
        // Extra Credit: Add an explosion graphic
      };

      return I;
    }

此代码稍后在脚本中使用,据我所知,这必须是使用Bullet(I)函数的脚本的相关部分?

playerBullets.forEach(function(bullet) {
    bullet.update();
});

3 个答案:

答案 0 :(得分:2)

我个人称之为通常意义上的构造函数,正如您所说的那样,您会像var myBullet = new Bullet()一样使用它。

然而,它通过使用javascripts松散类型来执行“构造”和对象的类似工作,以便能够在运行时向对象添加属性和方法。这种方法可以像:

一样使用
var myBullet = {}; // blank object
Bullet(myBullet);
// myBullet now has methods .draw, .active etc

我发现您下载的代码来自this tutorial,而Bullet方法确实在index.html的第167行调用。它在玩家射击时配置子弹:

player.shoot = function() {
      Sound.play("shoot");

      var bulletPosition = this.midpoint();

      playerBullets.push(Bullet({ //<-- here
        speed: 5,
        x: bulletPosition.x,
        y: bulletPosition.y
      }));
    };

答案 1 :(得分:2)

似乎Bullet正在将一个(可能是空的)对象作为参数然后将其变成Bullet“class”的对象(是的,我知道javascript没有类,但你知道我的意思) 。我怀疑这样做的原因是确保对象被重用而不是被创建和销毁。这意味着更少的垃圾收集发生,因此游戏运行更顺畅

答案 2 :(得分:1)

看来,它需要一个可能的对象,即“我”作为输入,并将东西附加到它并返回它。无需实例化Bullet本身。您只需要适当的I(输入)对象。最好它应该被称为“构建函数”。