передача обьектов в функцию через this
Итак, друзья, такая проблема: Есть у меня обьект со случайно генерируемыми параметрами и есть функция, которая присваивает одной из переменных обьекта конкретное значение в зависимости от того, какое значение примет зависимая переменная обьекта. Например, есть у в обьекте переменная "возраст", которая может колебаться в диапазовне от 5 до 60 лет. А есть переменная "взрослый", которая должна принимать истинное значение, если возраст равен или больше 18, и ложное - если возраст меньше 18. Для этой задачи я написал небольшую функцию:
const ADULT_YES = 1,
ADULT_NO = 2;
function getAdult(people) {
if (people.age < 18) {
people.adult = ADULT_NO;
} else {
people.adult = ADULT_YES;
}
}
function getRandom(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min; //Максимум и минимум включаются
};
{
gender: newGender,
fraction: getRandom(0, 6),
race: getRandom(0, 4),
age: getRandom(age1, age2),
adult: getAdult(this),
socialStats: socStat,
work: getWorker(this),
workPlace: 0,
}
Однако, выполняя данный код, переменная "взрослый" всегда возвращает значение "не определен". Подозреваю, что проблема в использовании this, возможно он считывает не тот обьект, в котором находится функция, а может еще что не так. Помогите разобраться, что не так, и как исправить это?
Ответы (1 шт):
В данном куске кода
adult: getAdult(this),
идет попытка присвоить свойству adult значение, которое возвращает getAdult, однако, данная функция
function getAdult(people) {
if (people.age < 18) {
people.adult = ADULT_NO;
} else {
people.adult = ADULT_YES;
}
}
Ничего не возвращает, поэтому присваивается undefined.
Также, передается this, который нигде не определяется и поэтому имеет значение глобального объекта.
Для решения нужно либо сделать функцию конструктор, либо воспользоваться свойствами(getter, setter)
Например:
const ADULT_YES = 1,
ADULT_NO = 2;
function getAdult(people) {
if (people.age < 18) {
return ADULT_NO;
} else {
return ADULT_YES;
}
}
function getRandom(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min; //Максимум и минимум включаются
};
var obj = {
age: getRandom(5, 60),
get adult() {
return getAdult(this)
}
}
console.log(obj)