2016-08-16 3 views
0

Почему аргументы isSingle и household, кажется, не переходят к соответствующим свойствам объекта Person при их создании и подталкивая их к kidsArr в конце сценария внутри switch в то время как экземпляры созданный ранее в скрипте и нажатый на s20to24Arr, похоже, правильно обрабатывает аргументы? Что мне не хватает?Javascript конструктор объекта не зарегистрирует аргумент

startPop = 1000 
 

 
var getRandom = function(min, max) { 
 
    return Math.random() * (max - min) + min; 
 
}; 
 

 
var lastNames = ['SMITH', 'JOHNSON', 'WILLIAMS', 'JONES', 'BROWN', 'DAVIS', 'MILLER']; 
 
var firstNamesMale = ["Michael", "Christopher", "Jason", "David", "James", "John"]; 
 
var firstNamesFemale = ["Jennifer", "Amy", "Melissa", "Michelle", "Kimberly"]; 
 

 
var sex = ["Male", "Female"]; 
 

 
var genSex = function() { 
 
    var index = Math.round(getRandom(0, sex.length - 1)); 
 
    return sex[index]; 
 
}; 
 

 
var genLastName = function() { 
 
    var index = Math.round(getRandom(0, lastNames.length - 1)); 
 
    return lastNames[index]; 
 
}; 
 

 
var genFirstNameMale = function() { 
 
    var index = Math.round(getRandom(0, firstNamesMale.length - 1)); 
 
    return firstNamesMale[index]; 
 
}; 
 

 
var genFirstNameFemale = function() { 
 
    var index = Math.round(getRandom(0, firstNamesFemale.length - 1)); 
 
    return firstNamesFemale[index]; 
 
}; 
 

 
var s20to24Arr = []; 
 
var householdArray = []; 
 
var kidsArr = []; 
 

 
var sing20to24 = Math.round(startPop * 0.088 * 0.8385); 
 

 
var Person = function(sex, age, isSingle, lastName, household) { 
 
    if (sex === undefined) { 
 
    this.sex = genSex(); 
 
    } else { 
 
    this.sex = sex; 
 
    } 
 
    if (lastName === undefined) { 
 
    this.lastName = genLastName(); 
 
    } else { 
 
    this.lastName = lastName; 
 
    } 
 
    this.firstName = this.sex === "Male" ? genFirstNameMale() : genFirstNameFemale(); 
 
    if (age === undefined) { 
 
    this.age = genAgeAdult(); 
 
    } else { 
 
    this.age = age; 
 
    } 
 
    //this.income = 0; 
 
    //this.isEmployed = true; 
 
    //this.isRetired = false; 
 
    this.isSingle = isSingle; 
 
    this.household = household; 
 
}; 
 

 
var Household = function(man, woman) { 
 
    this.man = man; 
 
    this.woman = woman; 
 
    //this.house = undefined; 
 
    this.kid1 = undefined; 
 
    this.kid2 = undefined; 
 
    this.kid3 = undefined; 
 
    //this.income : this.man.income + this.woman.income; 
 
    //this.expenses : 0; 
 
    //this.savings : 0; 
 
    //this.debts : 0; 
 
    //this.isHomeOwner : true; 
 
}; 
 

 
var numKids = function(isSingle) { 
 
    var num = getRandom(0, 100); 
 
    if (!isSingle) { 
 
    if (num <= 47.73) { 
 
     return 0; 
 
    } else if (num <= 68.22) { 
 
     return 1; 
 
    } else if (num <= 90.46) { 
 
     return 2; 
 
    } else { 
 
     return 3; 
 
    } 
 
    } else { 
 
    if (num <= 82.31) { 
 
     return 0; 
 
    } else if (num <= 93.04) { 
 
     return 1; 
 
    } else if (num <= 98.11) { 
 
     return 2; 
 
    } else { 
 
     return 3; 
 
    } 
 
    } 
 

 
}; 
 

 
//This creates instances of the Person object with lastName, firstName, sex, age, isSingle and household properties. It also creates an instance of the Household object. 
 
for (var i = 0; i < sing20to24; i += 2) { 
 
    s20to24Arr.push(new Person("Male", Math.round(getRandom(20, 24)), true)); 
 
    s20to24Arr.push(new Person("Female", Math.round(getRandom(20, 24)), true)); 
 
    var curMale = s20to24Arr[i], 
 
    curFem = s20to24Arr[i + 1]; 
 
    householdArray.push(new Household(curMale)); 
 
    var index = householdArray.length > 0 ? householdArray.length - 1 : 0; 
 
    curMale.household = householdArray[index]; 
 
    householdArray.push(new Household(undefined, curFem)); 
 
    curFem.household = householdArray[index + 1]; 
 
    var kids = numKids(true); 
 
    switch (kids) { 
 
    case 0: 
 
     break; 
 
    case 1: 
 
     kidsArr.push(new Person(undefined, Math.round(getRandom(0, 5), true, curFem.lastName, 
 
     curFem.household))); 
 
     var ind = kidsArr.lenght - 1; 
 
     curFem.household.kid1 = kidsArr[ind]; 
 
     break; 
 
    case 2: 
 
     kidsArr.push(new Person(undefined, Math.round(getRandom(0, 5), true, curFem.lastName, 
 
     curFem.household))); 
 
     kidsArr.push(new Person(undefined, Math.round(getRandom(0, 5), true, curFem.lastName, 
 
     curFem.household))); 
 
     var ind = kidsArr.lenght - 1; 
 
     curFem.household.kid1 = kidsArr[ind - 1]; 
 
     curFem.household.kid2 = kidsArr[ind]; 
 
     break; 
 
    case 3: 
 
     kidsArr.push(new Person(undefined, Math.round(getRandom(0, 5), true, curFem.lastName, 
 
     curFem.household))); 
 
     kidsArr.push(new Person(undefined, Math.round(getRandom(0, 5), true, curFem.lastName, 
 
     curFem.household))); 
 
     kidsArr.push(new Person(undefined, Math.round(getRandom(0, 5), true, curFem.lastName, 
 
     curFem.household))); 
 
     var ind = kidsArr.lenght - 1; 
 
     curFem.household.kid1 = kidsArr[ind - 2]; 
 
     curFem.household.kid2 = kidsArr[ind - 1]; 
 
     curFem.household.kid3 = kidsArr[ind]; 
 
     break; 
 
    } 
 
} 
 
console.log(s20to24Arr[0]); 
 
console.log(kidsArr[0]);

ответ

1

Вы уверены, что вы помещаете скобки в правильных местах?

Вы можете сделать это:

new Person(
    undefined, 
    Math.round(
     getRandom(0, 5), 
     true, 
     curFem.lastName, 
     curFem.household 
    ) 
) 

Я отступом код на цели, так что вы можете увидеть свою ошибку. Вы передаете 2 параметра в конструктор Person, второй - Math.round (...), который ест остальные параметры.

Это должно, вероятно, будет так:

new Person(
    undefined, 
    Math.round(getRandom(0, 5)), 
    true, 
    curFem.lastName, 
    curFem.household 
) 

Я больше ничего не проверял, там может быть больше ошибок, но это упускается основная ошибка.

s20to24Arr получает правильный объект, потому что вы ставите круглые скобки правильно есть:

s20to24Arr.push(
    new Person("Male", Math.round(getRandom(20, 24)), true) // here Math.round takes only 1 parameter as it should 
);