Реализация add(1)(2) и расширение прототипа Number Каррирование функции — это приём, при котором функция возвращает новую функцию, сохраняя параметр в замыкании add(a) => (b) => a + b — минимальная реализация с замыканием Чтобы добавлять значения к числам через прототип, используется Number.prototype.add = function(b) { return this + b } Важно учитывать, что внутри метода прототипа this является объектом-обёрткой. Для получения примитивного значения его нужно преобразовать с помощью +this Цепочку вызовов можно построить, переопределив valueOf или toString, чтобы выполнять суммирование отложенно add(1)(2) представляет собой функцию,…
Как реализовать add(1)(2) и расширить прототип Number?
Реализация add(1)(2) и расширение прототипа Number Каррирование функции — это приём, при котором функция возвращает новую функцию, сохраняя параметр в замыкании add(a) => (b) => a + b — минимальная реализация с…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Реализация add(1)(2) и расширение прототипа Number
- Каррирование функции — это приём, при котором функция возвращает новую функцию, сохраняя параметр в замыкании
add(a) => (b) => a + b— минимальная реализация с замыканием- Чтобы добавлять значения к числам через прототип, используется
Number.prototype.add = function(b) { return this + b } - Важно учитывать, что внутри метода прототипа
thisявляется объектом-обёрткой. Для получения примитивного значения его нужно преобразовать с помощью+this - Цепочку вызовов можно построить, переопределив
valueOfилиtoString, чтобы выполнять суммирование отложенно add(1)(2)представляет собой функцию, возвращающую функцию, а не метод прототипа. Метод прототипа предназначен для вызова черезnum.add(3)- Практическая ценность такого подхода — удобная организация цепочек вызовов и настройка поведения примитивных значений
Итак, для add(1)(2) требуется функция, которая возвращает новую функцию и накапливает аргументы. Добавление метода в прототип Number позволяет расширить поведение всех чисел через методы экземпляров.
Подробный ответ
Основной ответ
Для создания цепочки вызовов в формате add(1)(2) и далее можно применить функциональное замыкание. У возвращаемой функции переопределяют метод toString или valueOf, благодаря чему результат вычисляется только при необходимости. При преобразовании функции к примитивному значению такой подход возвращает сумму всех переданных аргументов.
Ключевые моменты
- Функция
addсоздаёт и возвращает другую функцию. Она принимает следующий операнд, а накопленную сумму хранит в замыкании. - Если переопределить у функции метод
valueOf, он сможет возвращать актуальную сумму, например во время явного преобразования значения к числу (+add(1)(2)). - Вместо этого для вывода результата можно переопределить
toString. Такой вариант удобен, например, при логировании. - Расширение прототипа
Number.prototypeсчитается нетипичной практикой, однако технически его можно выполнить черезNumber.prototype.add = function (x) { return this.valueOf() + x; }, чтобы затем вызывать(5).add(3).
Практический пример реализации функции add:
function add(x) {
let sum = x;
function inner(y) {
sum += y;
return inner;
}
inner.valueOf = function () {
return sum;
};
return inner;
}
// Использование:
console.log(+add(1)(2)(3)); // 6
Как добавить метод в прототип Number (используется редко):
Number.prototype.add = function (x) {
return this.valueOf() + x;
};
// Использование:
console.log((5).add(10)); // 15
Практический контекст
Подобные решения применяют в цепочных API функционального стиля, DSL и сценариях с ленивыми вычислениями. Переопределение valueOf и toString — распространённый в JavaScript паттерн для объектов-функций: он позволяет задействовать их в примитивных операциях. При расширении стандартных примитивов в реальных проектах следует соблюдать осторожность, чтобы сохранить согласованность кода и совместимость.