无法在存储对象数组时设置对象属性(JavaScript)

Unable to set object property in storing to an array of objects (JavaScript)

本文关键字:对象 属性 JavaScript 设置 数组 存储      更新时间:2023-09-26

我正尝试着为一款简单的基于画布的《太空入侵者》游戏创造一个对象数组。我创造了一个太空入侵者物体,和一组太空入侵者。在将每个入侵者添加到数组之前,我想稍微改变它的水平位置和其他属性。我是这样做的:

// Invaders
invaders = new Array();
invader = {
    x: 0,
    y: 0,
    size: 25,
    xspeed: 0.25,
    yspeed: 0.1,
    alive: 1,
    letter: ""
};
invadersMovingLeft = true;
kills = 0;
word = "interesting";
numberOfInvaders = word.length;
letters = word.split('');
letterNumber = 0;
xpos = 0;
invaderSpacing = 50;
exploding = false;
shuffledLetters = shuffle(letters);
hitLetters = "";
for (i = 0; i < numberOfInvaders; i++) {
    invader['letter'] = shuffledLetters[letterNumber];
    invader['x'] = xpos;
    xpos = xpos + invaderSpacing;
    letterNumber = letterNumber + 1;
    invaders[i] = invader;
    console.log(invaders);
}

控制台日志显示每个入侵者具有完全相同的属性。知道这里出了什么问题吗?我刚开始使用对象,可能犯了初学者的错误。

问题是您试图使用invader作为基对象,这使得所有入侵者都引用相同的对象。

相反,有一个像类一样的入侵者,你可以实例化它来创建一个新的入侵者。然后,每个入侵者都是一个新的独立实例,您可以将其压入数组。

function invader(){
    this.x = 0;
    this.y = 0;
    this.size = 25;
    this.xspeed = 0.25;
    this.yspeed = 0.1;
    this.alive = 1;
    this.letter = "";
}
var invaders=new Array();
var inv;
for(i=0;i<numberOfInvaders;i++){
    inv = new invader();
    inv.letter = shuffledLetters[letterNumber];
    inv.x = xpos;
    xpos = xpos+invaderSpacing;
    letterNumber = letterNumber+1;
    invaders.push(inv);
}
console.log(invaders);

尝试添加

var newInvader = new invader(); 

到你的循环。(第一行)

然后将newInvader的属性更改为您想要的,然后将newInvader添加到数组中,而不是invader。