Gernar
HTTP, API и сеть

Как работают методы прототипов на примитивах

Разбор вопроса «Как работают методы прототипов на примитивах» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Как работают методы прототипов на примитивах

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет убедиться, что кандидат понимает механизм работы методов у примитивов в JavaScript, включая концепцию автоупаковки и временных объектов-обёрток. Важно показать понимание разницы между примитивами и объектами в JS.

Ключевые тезисы

  • Примитивы (string, number, boolean) не являются объектами, но при обращении к их методам JS временно оборачивает их в объекты-обёртки (String, Number, Boolean), чтобы вызвать методы прототипа.
  • После выполнения метода временный объект удаляется, и мы снова работаем с примитивом. Это называется "автоупаковкой" (autoboxing).
  • Например, при вызове 'str'.toUpperCase() создаётся временный объект String, вызывается метод, возвращается результат, а объект уничтожается.
  • Это объясняет, почему мы можем использовать методы у примитивов, хотя технически они не являются объектами.

Подробный ответ

В JavaScript примитивы, такие как строки, числа и булевы значения, не являются объектами. Однако, когда мы пытаемся вызвать метод у примитива, JavaScript временно оборачивает его в соответствующий объект-обёртку (например, String, Number или Boolean). Этот процесс называется автоупаковкой (autoboxing). После вызова метода временный объект удаляется, и мы снова работаем с примитивом. Это позволяет использовать методы прототипов у примитивов, хотя технически они не являются объектами. Например, при вызове 'str'.toUpperCase(), JavaScript создаёт временный объект String, вызывает метод toUpperCase(), возвращает результат, а затем уничтожает временный объект. Это объясняет, почему мы можем использовать методы у примитивов, хотя они не являются объектами. Однако, важно отметить, что примитивы не могут иметь собственных методов, так как они не являются объектами и не могут хранить свойства. Если попытаться присвоить свойство примитиву, оно будет проигнорировано или удалено после завершения операции.

Практические примеры

Пример 1

Пример с использованием метода toUpperCase() у строки: const str = 'hello'; console.log(str.toUpperCase()); // Output: 'HELLO'

Пример 2

Пример с использованием метода toString() у числа: const num = 42; console.log(num.toString()); // Output: '42'

Пример 3

Пример с попыткой присвоить свойство примитиву: const str = 'hello'; str.customProperty = 'value'; console.log(str.customProperty); // Output: undefined

Частые ошибки

  • Попытка добавить собственные методы в прототипы примитивов, что невозможно, так как примитивы не являются объектами.
  • Ожидание, что свойства, присвоенные примитиву, сохранятся, хотя они будут проигнорированы или удалены.

Связанные темы

  • Прототипы и наследование в JavaScript
  • Объекты-обёртки в JavaScript
  • Автоупаковка (autoboxing) в JavaScript

Follow-up вопросы

Какие методы прототипов доступны для строк?

Уровень: basic

Для строк доступны методы, такие как toUpperCase(), toLowerCase(), slice(), indexOf(), replace() и другие, которые определены в прототипе объекта String.

Можно ли добавить собственные методы в прототипы примитивов?

Уровень: intermediate

Да, можно расширять прототипы примитивов, например, добавив метод в String.prototype, но это считается плохой практикой, так как может привести к конфликтам и неожиданным побочным эффектам.

Как работает автоупаковка при использовании методов у чисел?

Уровень: intermediate

При вызове методов у чисел, например, toFixed(), JavaScript временно оборачивает число в объект Number, чтобы вызвать метод, после чего объект уничтожается, и мы снова работаем с примитивом.

Почему примитивы не могут иметь собственных методов?

Уровень: advanced

Примитивы не являются объектами и не имеют свойств или методов. Однако JavaScript автоматически оборачивает их в объекты при вызове методов, чтобы использовать методы их прототипов.

Что произойдёт, если попытаться присвоить свойство примитиву?

Уровень: advanced

JavaScript временно обернёт примитив в объект, присвоит свойство, но после этого объект будет удалён, и свойство будет потеряно. Это не вызовет ошибки, но и не будет иметь эффекта.

Содержание