🟨 JavaScript
Сложная
🕐 15 min

Расширение типа Number для цепочки операций

Цель: расширить встроенный тип Number для поддержки цепочки арифметических операций.

Описание задачи

Вам нужно добавить к прототипу Number четыре метода: plus(num), minus(num), multiply(num) и divide(num). Эти методы должны позволять выполнять последовательные арифметические операции, как показано в примере:

const result = (10).plus(5).minus(3).multiply(2).divide(4);
// result должен быть равен 6

Эта задача поможет вам глубже понять прототипное наследование в JavaScript, а также концепцию “fluent API” (текучего интерфейса), когда вызовы методов можно выстраивать в цепочку.

💡 Подсказка к решению
  1. Для добавления методов ко всем числам используйте Number.prototype.
  2. Внутри каждого метода this будет ссылаться на число, к которому применяется метод.
  3. Каждый метод должен возвращать результат операции (новое число), чтобы следующий метод в цепочке мог с ним работать.
  4. Не забудьте обработать случай деления на ноль в методе divide.
👀 Решение
/**
 * Расширяем прототип Number, чтобы добавить новые методы.
 * `this` внутри этих методов будет ссылаться на число,
 * к которому применяется метод.
 */
 
// Метод для сложения
Number.prototype.plus = function(num) {
  // `this` - это текущее число (например, (2) в (2).plus(3))
  // Мы возвращаем результат сложения, чтобы можно было продолжить цепочку
  return this + num;
};
 
// Метод для вычитания
Number.prototype.minus = function(num) {
  return this - num;
};
 
// Метод для умножения
Number.prototype.multiply = function(num) {
  return this * num;
};
 
// Метод для деления
Number.prototype.divide = function(num) {
  // Обработка деления на ноль
  if (num === 0) {
    return Infinity;
  }
  return this / num;
};

Пошаговое объяснение кода:

  1. Number.prototype.plus = function(num) { ... };

    • Мы обращаемся к Number.prototype, чтобы добавить новый метод plus ко всем экземплярам Number (т.е. ко всем числам).
    • Функция принимает один аргумент num — число, которое нужно прибавить.
  2. return this + num;

    • this в контексте этого метода — это значение числа, к которому применяется метод. Например, в выражении (5).plus(3), this будет равен 5.
    • Мы возвращаем результат сложения this и num. Это ключевой момент для построения цепочки: результат (5).plus(3) (т.е. 8) становится новым this для следующего вызова в цепочке.
  3. Аналогичные методы minus, multiply, divide

    • Они работают по тому же принципу, выполняя соответствующие арифметические операции.
  4. Обработка деления на ноль

    • В методе divide мы добавили проверку: if (num === 0). Если мы пытаемся делить на ноль, функция вернет Infinity, что соответствует стандартному поведению JavaScript.

Почему именно так:

  • Расширяемость: Модификация прототипа позволяет добавить новую функциональность ко всем объектам определенного типа, не изменяя каждый объект по отдельности.
  • Читаемость: Цепочки вызовов (fluent API) делают код более декларативным и легко читаемым, напоминая естественный язык.
  • Осторожность: Хотя это отличный пример для обучения, в реальных крупных проектах изменять прототипы встроенных объектов (Number, Array, String и т.д.) считается плохой практикой. Это может привести к конфликтам с другими библиотеками или будущими версиями JavaScript.

Примеры

// Простое сложение
(2).plus(3); // 5
 
// Цепочка операций
(2).plus(3).minus(1); // 4
 
// Полная цепочка
(10).multiply(2).plus(5).divide(5).minus(2); // 3

Требования

  • Необходимо добавить четыре метода в Number.prototype: plus, minus, multiply, divide.
  • Каждый метод должен принимать один числовой аргумент.
  • Каждый метод должен возвращать результат операции, чтобы обеспечить возможность цепочки вызовов.

🧑‍💻 Это не баг! Это фича!

Редактор кода намеренно скрыт на мобильном.

Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.

📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.

💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!