我正在尝试为简单的基于画布的Space Invaders游戏创建一个对象数组。 我创建了一个空间入侵者对象和一个空间入侵者数组。我想在添加到数组之前稍微更改每个入侵者的水平位置和其他属性。这是我正在努力做到这一点:无法设置存储到对象数组中的对象属性(JavaScript)
// 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);
}
控制台日志显示每个入侵者具有完全相同的特性。任何想法这里有什么问题?我在与对象合作方面很陌生,可能会让初学者犯下错误。
谢谢,这有助于很多。那么,在我试图这样做的时候,对象中的属性是不能改变的呢?一旦他们设定,他们永久? – praine
对象属性_可以更改。例如: var obj = {a:'hi'}; obj.a // =>'hi'; obj.a ='bye'; obj.a; // =>'bye' 但是如果你说obj2 = obj,现在已经对同一个对象做了一个新的_reference_。您对obj2所做的任何更改都会影响obj。你对obj所做的任何修改都会影响obj2。所以这就是为什么你需要在实例化你的个人入侵者时使用新的关键字。您使用invader()构造函数的语法允许您使用'new'来实例化各个实例。 – LexJacobs
@ user3737956不,它们不是永久的,只要你有一个对象的引用,你可以随时随意更改属性。在你的代码中,你正在使用'invader',然后将它附加到数组中,所以你每次都将相同的对象添加到数组中。我的代码创建了一个入侵者类,并创建了它的多个实例,它们都是相互独立的。 – MrCode