← Назад к вопросам
Как работают методы прототипов на примитивах?
2.0 Middle🔥 171 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы прототипов на примитивах
Это один из самых интересных и иногда непонятных механизмов JavaScript. Примитивные типы (строки, числа, булевы значения) — это не объекты, но мы можем вызывать на них методы так, как будто бы они объекты.
Как это работает
JavaScript использует процесс автоматического упаковки (autoboxing). Когда вы вызываете метод на примитиве, движок JavaScript временно создаёт объект-обёртку (wrapper object), вызывает метод на нём, а затем удаляет этот объект.
// Примитив
const str = "hello";
// Когда вы пишете:
const result = str.toUpperCase();
// Движок делает в фоне что-то вроде:
const temp = new String("hello"); // Упаковка в объект
const result = temp.toUpperCase(); // Вызов метода
temp = null; // Удаление обёртки
Встроенные объекты-обёртки
Dля каждого примитивного типа существует функция-конструктор:
// Строки
const str = "hello";
str.charAt(0); // "h"
str.includes("ell"); // true
str.split("").reverse().join(""); // "olleh"
// Числа
const num = 42.567;
num.toFixed(2); // "42.57"
num.toString(2); // "101010" (в двоичной системе)
num.toLocaleString(); // "42.567" с локализацией
// Логические значения
const bool = true;
bool.toString(); // "true"
Когда упаковка работает
// Работает — вызов метода
const len = "text".length; // 4
const upper = "text".toUpperCase(); // "TEXT"
// Не работает — добавление свойств
const str = "hello";
str.custom = "value";
console.log(str.custom); // undefined
// Почему?
// str.custom = "value" создаёт обёртку, добавляет свойство, потом удаляет
// str.custom при чтении создаёт новую обёртку без этого свойства
Явная и неявная упаковка
// Неявная упаковка (автоматическая)
const result = "42".toString(); // работает
// Явная упаковка
const strObj = new String("42");
const result2 = strObj.toString(); // тоже работает
// Различие
console.log(typeof "42"); // "string"
console.log(typeof new String("42")); // "object"
// Неявная упаковка vs объект
"42" === "42"; // true
new String("42") === new String("42"); // false (разные объекты)
Практические примеры
// Строки
const email = "user@example.com";
const domain = email.split("@")[1]; // "example.com"
const formatted = email.toUpperCase(); // "USER@EXAMPLE.COM"
// Числа
const price = 99.999;
price.toFixed(2); // "100.00"
price.toPrecision(3); // "1.00e+2"
// null и undefined НЕ имеют методов!
null.toString(); // TypeError: Cannot read property
undefined.toString(); // TypeError
Важные моменты
- Упаковка временная — свойства примитивов теряются после выполнения
- null и undefined — исключение, у них нет методов
- Производительность — упаковка очень быстрая, современные движки её оптимизируют
- Избегай явного создания объектов-обёрток — используй примитивы напрямую
Этот механизм позволяет писать удобный и чистый код, не беспокоясь о различиях между примитивами и объектами.