Измените «arr» на «this». Учитывайте, что создание методов встроенных в движок js объектов — плохая практика.
Но если вы уж хотите, то в любом случае ваш способ не верный. Дело в том, что при перечислении ячеек массива, при созданном методе вашим способом, он всегда будет попадать в перечисления вида:
Array.prototype.sum = function() { /** ... */ }
const arr = [1, 2, 3]
// console.log в этом цикле выведет в консоль: 0, 1, 2, sum
// Т.е. «sum» всегда будет попадать в for..in-перечисления любых массивов в коде
for (let i in arr) {
console.log(i)
}
Понимаете, что это может не только помешать вам, но и сломать существующий код в подключенных библиотеках. Что бы избежать подобного, используйте следующий код:
Object.defineProperty(Array.prototype, 'sum', {
enumerable: false,
value: function() {
let sum = 0
for (let i = 0; i < this.length; i++) {
if (typeof this[i] !== 'number' && !(this[i] instanceof Number)) {
throw new TypeError('Нечисловой массив')
}
sum += this[i]
}
return sum
}
})
А еще лучше, используйте отдельно созданную функцию, принимающую массив в аргументах.