Неправильно работает метод с функцией(функция вне метода работает правильно)

Рейтинг: 1Ответов: 3Опубликовано: 16.02.2023

функция сама по себе

function sumSalaries() {

    let sum = 0;
    for (let salary of Object.values(salaries)) {
      sum += salary;
    }
  
    console.log(sum) 
  }
sumSalaries()

Функция внутри метода объекта

salaries.sum2 = function () {

    let sum = 0;
    for (let salary of Object.values(salaries)) {
      sum += salary;
    }
  
    console.log(sum) 
  }
  salaries.sum2()

Сам объект

let salaries = {
  worker0: 5040,
  worker1: 6400,
  worker2: 3000,
  worker3: 2100,
  worker4: 1300,
  worker5: 600,
};

Нужно что бы выходила сумма всех ключей и это работает в функции, но когда я помещаю её в метод то всё ломается

  • Первая строка-сама функция
  • Вторая стока-функция в методе

Ответы

▲ 1

При простом добавлении свойства в объект, оно становится перечислимым, поэтому входит в набор возвращаемый такими функциями как Object.values, Object.keys и т.д.

Для решения достаточно добавить функцию не в объект, а в прототип. Свойства из прототипа не возвращаются указанными выше методами.

Для получения прототипа объекта можно использовать метод Object.getPrototypeOf

let salaries = {
  worker0: 5040,
  worker1: 6400,
  worker2: 3000,
  worker3: 2100,
  worker4: 1300,
  worker5: 600,
};

Object.getPrototypeOf(salaries).sum2 = function() {

  let sum = 0;
  for (let salary of Object.values(salaries)) {
    sum += salary;
  }

  console.log(sum)
}
salaries.sum2()

▲ 0

Надо исключать себя(функцию sum2) из рассчета.

this - это контекст фукнции, в данном случае, это сам объект salaries.

let salaries = {
  worker0: 5040,
  worker1: 6400,
  worker2: 3000,
  worker3: 2100,
  worker4: 1300,
  worker5: 600,
};

salaries.sum2 = function () {
  let sum = 0;
  for (let i in this) {
    if (i !== 'sum2') {
      sum += this[i];
    }
  }
  return sum;
}

console.log(salaries.sum2())

▲ 0

Нужно что бы выходила сумма всех ключей и это работает в функции, но когда я помещаю её в метод то всё ломается

Так ты пытаешься прибавить и саму функцию. Она ведь так же есть теперь в ключах. ;)

let salaries = {
  worker0: 5040,
  worker1: 6400,
  worker2: 3000,
  worker3: 2100,
  worker4: 1300,
  worker5: 600,
};

salaries.sum2 = function() {
  let sum = 0;
  for (let salary of Object.values(this)) {
    if (typeof salary === 'number') sum += salary;
  }
  console.log(sum)
}
salaries.sum2()