Как реализовать 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) представляет собой функцию,…

Подробный разбор

Ответ с пояснениями

Реализация 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 паттерн для объектов-функций: он позволяет задействовать их в примитивных операциях. При расширении стандартных примитивов в реальных проектах следует соблюдать осторожность, чтобы сохранить согласованность кода и совместимость.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку