簡體   English   中英

這是常規的構造函數嗎?

[英]Is this a regular constructor function?

所以我一直在看我下載的游戲腳本。 我不確定的是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();
});

我不會親自將其稱為通常意義上的構造函數,在正確意義上,您將像var myBullet = new Bullet()那樣使用它。

但是,通過使用javascript松散類型,它能夠在運行時向對象添加屬性和方法,從而完成了“構造”和對象的類似工作。 該方法的用法如下:

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

當我發現您下載的代碼來自本教程時 ,確實在index.html的第167行調用了Bullet方法。 它在玩家射擊時配置子彈:

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

      var bulletPosition = this.midpoint();

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

看來Bullet將一個(可能是空的)對象作為參數,然后將其變成Bullet“類”的對象(是的,我知道javascript沒有類,但是您知道我的意思)。 我懷疑這樣做的原因是為了確保對象被重用,而不是被創建和銷毀。 這意味着更少的垃圾收集發生,因此游戲運行更加流暢

看來,它采用了一個可能的對象(即“ I”)作為輸入,並將內容附加到該對象上並返回該對象。 無需實例化Bullet本身。 您只需要適當的I(nput)對象。 充其量應該稱為“構建器功能”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM