[英]Closure versus regular constructor function for creating private properties?
[英]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.