Javascript对象数组,共享同一成员数组的对象?

时间:2016-05-28 14:04:38

标签: javascript arrays object

我有一个对象数组(这个对象也包含它自己的数组)我不知道为什么,但是当我将一些值推送到对象数组中对象的一个​​实例的成员数组时它也似乎在所有其他对象数组上推送到其他成员数组。我在下面提供了我的代码:

var ImageGroup = {
  GroupName:"",
  haz:[]
};

var ImageHandler = {
ImageGroupsArray:[],


image_process: function() {
//Calling the function here...

//Pushing the objects
this.ImageGroupsArray.push(Object.create(ImageGroup));
this.ImageGroupsArray.push(Object.create(ImageGroup));

//Assigning some values
this.ImageGroupsArray[0].haz.push("Dog");
this.ImageGroupsArray[1].haz.push("Cat");

//Should output array with only 'Dog' in it
console.log(this.ImageGroupsArray[0].haz);

//Should output array with only 'Cat' in it
console.log(this.ImageGroupsArray[1].haz);

//Instead, both of these output ["Dog","Cat"]
//this.ImageGroupsArray[1].haz and this.ImageGroupsArray[0].haz point to same 'haz' array??
}
}

当我尝试以相同的方式设置GroupName时,不会发生这种情况。我究竟做错了什么?感谢您提前提供任何帮助!

3 个答案:

答案 0 :(得分:1)

您正在ImageGroupArray中推送同一个对象function getImageGroup() { var imageGroup = new Object(); imageGroup.GroupName = ""; imageGroup.haz = []; return imageGroup; } this.ImageGroupsArray.push(getImageGroup()); this.ImageGroupsArray.push(getImageGroup()); ,因此它实际上在全局定义的同一个对象中生效。

试试这个

s = "abc你好def啊"
filter(None, re.split('(\w+|\W+)', s))

<强> Working Fiddle

答案 1 :(得分:1)

此代码:

var ImageGroup = {
  GroupName:"",
  haz:[]
};

在内存中创建单个对象。这段代码:

this.ImageGroupsArray.push(Object.create(ImageGroup));
this.ImageGroupsArray.push(Object.create(ImageGroup));

创建两个新对象(将每个对象推送到ImageGroupsArray上)。 这两个对象都与原型具有相同的ImageGroup对象。只知道原型如何工作将对你有所帮助。但基本上,这段代码:

this.ImageGroupsArray[0].haz.push("Dog");
this.ImageGroupsArray[1].haz.push("Cat");

在每个haz ed对象上查找Object.create()属性。当它找不到它时,它会查找原型链并在父对象上找到它(在两种情况下都是相同的对象)。当然,对这个对象所做的任何修改都会显示在引用该对象的所有位置(因此在你推送到ImageGroupsArray的两个对象中都是如此。)

正确的方法是将ImageGroup声明为定义其属性的函数:

var ImageGroup = function() {
    this.GroupName = '';
    this.haz = [];
}

然后使用new关键字,而不是Object.create()

this.ImageGroupsArray.push(new ImageGroup());
this.ImageGroupsArray.push(new ImageGroup());

Cheeers。

答案 2 :(得分:0)

您似乎两次引用相同的ImageGroup对象。 &#39; groupName&#39;属性被覆盖,但数组可以无限增长: - )

尝试:

var ImageGroup1 = {  GroupName:"foo",  haz:[]};
var ImageGroup2 = {  GroupName:"bar",  haz:[]};

所以你得到两个不同的对象,而不是两个对同一个对象的引用。