Неправильно работает метод с функцией(функция вне метода работает правильно)
функция сама по себе
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,
};
Нужно что бы выходила сумма всех ключей и это работает в функции, но когда я помещаю её в метод то всё ломается
- Первая строка-сама функция
- Вторая стока-функция в методе
Ответы (3 шт):
Надо исключать себя(функцию 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())
Нужно что бы выходила сумма всех ключей и это работает в функции, но когда я помещаю её в метод то всё ломается
Так ты пытаешься прибавить и саму функцию. Она ведь так же есть теперь в ключах. ;)
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()
При простом добавлении свойства в объект, оно становится перечислимым, поэтому входит в набор возвращаемый такими функциями как 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()
