我试图用init方法创建一个对象数组,当我将一个对象推入一个数组时,它应该将另一个对象推入数组,同时跟踪数组的长度。问题是,在添加所有对象之前,它不会更新数组的长度,因此当每个对象尝试获取长度时,它们都会得到0。 如何在此过程中更新长度? 这里是jfiddle:http://jsfiddle.net/bg3Vg/13/ 正如你所看到的那样,它给出了一条消息,表明该组合是5,但似乎总数从最后一个推送对象计数到第一个..我需要它以正确的顺序工作,以便最后一个被推送的对象可以检索正确的长度。
var colorGroup = [];
var grouptotal = 0;
colorGroup.push(new groupdata(0) );
alert(grouptotal+","+colorGroup[colorGroup.length-1].parent);
function groupdata(parent) {
this.parent = parent;
this.refnum;
this.init = function()
{
grouptotal++;
this.refnum = colorGroup.length;
if(grouptotal<5)colorGroup.push(new groupdata( this.refnum ) );
}
this.init();
}
编辑: 好吧,我找到了解决问题的方法。让我知道这个解决方案有多可怕.. http://jsfiddle.net/EqAqv/1/
var colorGroup = [];
var grouptotal = 0;
var colorGroupWait = [];
colorGroup.push(new groupdata(0) );
while(colorGroupWait.length>0){
var newcolorGroup = colorGroupWait.shift();
colorGroup.push(new groupdata(newcolorGroup) );
}
alert(grouptotal+","+colorGroup[colorGroup.length-1].parent);
alert(grouptotal+","+colorGroup[colorGroup.length-2].parent);
function groupdata(parent) {
this.parent = parent;
this.refnum;
this.init = function()
{
grouptotal++;
this.refnum = colorGroup.length;
if(colorGroup.length<5)colorGroupWait.unshift( this.refnum );
}
this.init();
}
答案 0 :(得分:2)
JavaScript数组执行一旦将某些内容推送到它们,就会更新length
属性。问题是您以递归方式调用构造函数,因此语句this.refnum = colorGroup.length
将在每次初始化时执行 BEFORE 任何推送都会执行。
换句话说,JavaScript正在按预期工作。
您是否有任何特殊原因以这种错综复杂的方式进行此操作?如果您这样做的话,它会更直接(并实现您正在寻找的结果):
for(grouptotal=0; grouptotal<5; grouptotal++){
colorGroup.push( new groupdata(grouptotal) );
}
此外,JavaScript中的惯例是使用大写字母命名对象构造函数。因此,虽然groupdata
语法无效,但令人困惑:您应该考虑将其命名为Groupdata
。
答案 1 :(得分:0)
@EthanBrown已经指出了这些问题。这是一个将所有逻辑放在构造函数中的解决方案,并避免在从错误的数字创建实例后推送实例的问题。
function GroupData(parentnum) {
this.parentnum = parentnum;
this.refnum = GroupData.colorGroup.length;
GroupData.colorGroup.push(this);
if (GroupData.colorGroup.length < 5)
new GroupData(this.refnum);
}
GroupData.colorGroup = [];
var root = new GroupData(0);
alert(GroupData.colorGroup.length+", "
+GroupData.colorGroup[GroupData.colorGroup.length-1].parentnum);