3 回答
TA贡献1836条经验 获得超3个赞
每次迭代都将相同的怪物对象推送到数组上。这会导致数组元素喜欢this.monster[1]和this.monster[2] 彼此持有相同的对象。因此,如果您更改,monster[1]您正在更改monster[2]等等(包括currentMonster因为它们都引用同一个对象)
我假设您实际上是在尝试根据currentMonster属性创建新的怪物对象并尝试为它们分配新名称。
//these do shallow copy of the properties
//this is regular javascript might have to make
//changes to fit typescript syntax
//using spread operator to create new object
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
let newMonster = {...this.currentMonster}
//using Object.assign() to create new object
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
let newMonster = Object.assign({},this.currentMonster);
然后只需更改适当的属性并将新对象推送到数组上。
//give new monster a name
newMonster.name = this.currentMonster.name +" " + `${i+1}`;
//push the new monster on the array
this.monsters.push(newMonster);
TA贡献1794条经验 获得超8个赞
当你这样做时:
this.monsters.push(this.currentMonster)
您不是将currentMonster对象的副本推送到数组,而是推送对对象的引用。在这一点上,这意味着:
this.monsters[0] === this.currentMonster
那么当你改变 name 属性时:
this.monsters[i].name = newName
你也在改变currentMonster.name属性
您可能想要做的是创建currentMonster对象的副本并仅更改名称:
this.monsters.push({
...this.currentMonster,
name: `${this.currentMonster.name} ${i+1}`
})
TA贡献1874条经验 获得超12个赞
var arr = []; // create arry
var obj = {ima:"object"}; // create object
arr.push(obj); // pass same object 3 times
arr.push(obj);
arr.push(obj);
console.log(arr); // log arr
// will print : [
// {
// /**id:2**/
// "ima": "changed object"
// },
// /**ref:2**/,
// /**ref:2**/
// ]
obj.ima = "changed object"; // change the object
console.log(arr); // log the array, notice that object inside the array will be modified
arr[0].ima = "changed in the arr"; // then modify the object inside the array
console.log(obj); // notice original object will be modified.
arr.push(Object.assign({},obj)); // this is the copy or use ... operator in typescript
console.log(obj);
arr[1].ima = "something newer";
console.log(obj); // "remains same"
上面的代码与您在代码中所做的相同。您传递的是引用而不是复制的值。
添加回答
举报