Javascript 为什么子数组/对象上的属性设置为其最高索引同级的值?
我有一个类定义的对象,它包含另一个类定义对象的数组。 子类定义的对象有一个来自全局对象数组的对象数组 在下面的代码片段中,我希望出现以下情况:Javascript 为什么子数组/对象上的属性设置为其最高索引同级的值?,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个类定义的对象,它包含另一个类定义对象的数组。 子类定义的对象有一个来自全局对象数组的对象数组 在下面的代码片段中,我希望出现以下情况: 项目#0:柜台:1 项目#0:柜台:2 项目#0:柜台:3 项目#1:柜台:4 项目#1:柜台:5 项目#1:柜台:6 第2项:柜台:7 第2项:柜台:8 第2项:柜台:9 但是,下面的代码段会生成输出: 项目#0:柜台:7 项目#0:柜台:8 项目#0:柜台:9 项目#1:柜台:7 项目#1:柜台:8 项目#1:柜台:9 第2项:柜台:7 第2项
- 项目#0:柜台:1
- 项目#0:柜台:2
- 项目#0:柜台:3
- 项目#1:柜台:4
- 项目#1:柜台:5
- 项目#1:柜台:6
- 第2项:柜台:7
- 第2项:柜台:8
- 第2项:柜台:9
- 项目#0:柜台:7
- 项目#0:柜台:8
- 项目#0:柜台:9
- 项目#1:柜台:7
- 项目#1:柜台:8
- 项目#1:柜台:9
- 第2项:柜台:7
- 第2项:柜台:8
- 第2项:柜台:9
const NUMBER_OF_ITEMS=3;
const数组_OF_OBJ=[{“id”:1,“color”:“red”},{“id”:2,“color”:“green”},{“id”:3,“color”:“blue”}];
设全局_计数器=0;
类项目管理器{
构造函数(){
此项。项=[];
for(设i=0;i<项的个数;i++){
这个.Items.push(新的ItemObj(i));
}
}
}
类ItemObj{
构造函数(标识符){
this.id=标识符;
this.myData=[];
这是getValues();
}
getValues(){
for(设i=0;i<数组的长度;i++){
设myObj=Object.assign(数组_OF_OBJ[i]);
全局_计数器++;
myObj.counter=全局计数器;
this.myData.push(myObj);
}
}
}
//实例化并显示
const IM=新项目管理器();
对于(让项目成为IM.项目中的一项){
for(let Item.myData的数据){
$(“#输出”).append(`li style=“color:${data.color}>Item{Item.id}:Counter:${data.Counter}`);
}
}
您从对象数组的数组中的3个对象开始,每当调用getValues
时,这些对象会被多次引用:
let myObj = Object.assign(ARRAY_OF_OBJ[i]);
但你的记忆中仍然只有3个对象;myObj
只是指向这三个对象中的一个
将单个对象传递给对象。分配会产生相同的对象-它不会克隆它:
constobj={};
const obj2=对象分配(obj);
console.log(obj==obj2)代码>使用
让myObj=Object.assign({},数组_OF_OBJ[i])代码>
而不是
让myObj=Object.assign(数组_OF_OBJ[i])代码>
asObject.assign()
将引用同一个对象,除非您提供空对象作为第一个参数。提供空对象作为第一个参数将创建新对象,并将作为第二个参数提供的对象复制到该对象
但请记住,它仍然是一个肤浅的副本;嵌套对象仍将存储为引用
常数项的数量=3;
const数组_OF_OBJ=[{“id”:1,“color”:“red”},{“id”:2,“color”:“green”},{“id”:3,“color”:“blue”}];
设全局_计数器=0;
类项目管理器{
构造函数(){
此项。项=[];
for(设i=0;i<项的个数;i++){
这个.Items.push(新的ItemObj(i));
}
}
}
类ItemObj{
构造函数(标识符){
this.id=标识符;
this.myData=[];
这是getValues();
}
getValues(){
for(设i=0;i<数组的长度;i++){
设myObj=Object.assign({},数组_OF_OBJ[i]);
全局_计数器++;
myObj.counter=全局计数器;
this.myData.push(myObj);
}
}
}
//实例化并显示
const IM=新项目管理器();
对于(让项目成为IM.项目中的一项){
for(let Item.myData的数据){
$(“#输出”).append(`li style=“color:${data.color}>Item{Item.id}:Counter:${data.Counter}`);
}
}