javascript推送内部init方法没有正确更新数组长度

时间:2014-04-30 23:31:01

标签: javascript arrays push init

我试图用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();

}

2 个答案:

答案 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);