Вопрос проверяет понимание механизма временного преобразования примитивов в объекты и работы прототипов.
Строки — это примитивы, но при обращении к методу JavaScript временно оборачивает строку в объект String. Этот объект содержит методы, определённые в String.prototype. После вызова метода временный объект сразу удаляется. Поэтому методы у строк выглядят как “родные”, хотя сами строки объектами не являются.
Автоупаковка (autoboxing) — это механизм, при котором примитив временно превращается в объект-обёртку для доступа к методам.
Перед перечислением важно понять общий алгоритм, который выполняет движок JavaScript.
Есть примитив:
const str = "hello";
При вызове метода:
str.toUpperCase();
JavaScript:
Создаёт временный объект new String("hello")
Ищет метод в String.prototype
Вызывает метод
Удаляет временный объект
Методы не лежат “в строке”
Они находятся в String.prototype
Это можно проверить:
console.log(String.prototype.toUpperCase !== undefined); // true
Примитивы остаются лёгкими и простыми
Методы не дублируются для каждого значения
Сохраняется единая модель прототипного наследования
Попытка записать свойство в строку не работает:
const str = "hi";
str.test = 123;
console.log(str.test); // undefined
Это происходит потому, что объект-обёртка временный и сразу уничтожается.
Методы у строк появляются благодаря автоупаковке: примитив временно превращается в объект String, методы берутся из String.prototype, а затем объект исчезает.