Прототипы в JavaScript: встроенные объекты и обёртки для примитивов
-
В JavaScript всё (почти) — объект, и у каждого объекта может быть прототип — другой объект, из которого он наследует свойства и методы.
Представь: если у объекта нет нужного метода — он смотрит в свой прототип. Если и там нет — идёт дальше по цепочке. Это называется цепочкой прототипов.
1. Встроенные прототипы объектов
У встроенных конструкторов (вроде
Object
,Array
,Function
) есть прототипы, где хранятся общие методы.Например:
Array.prototype
Все массивы наследуют методы от
Array.prototype
:let arr = [1, 2, 3]; arr.push(4); // метод push взят из Array.prototype
То есть:
arr.__proto__ === Array.prototype // true
Аналогично:
Object.prototype
— база для всех объектовString.prototype
— содержитtoUpperCase()
,slice()
и др.Number.prototype
,Function.prototype
и т.д.
Эти прототипы позволяют всем объектам одного типа использовать одни и те же методы.
2. Прототипы объектов-обёрток для примитивов
Тут становится интереснее.
Примитивы — это не объекты:
string
,number
,boolean
,null
,undefined
,symbol
,bigint
Но... почему у строки есть методы вроде
.toUpperCase()
?"hello".toUpperCase(); // "HELLO"
Строка — примитив, а метод вызывается как у объекта. Как?
Магия: объекты-обёртки
Когда вы вызываете метод на примитиве, JavaScript временно оборачивает его в объект.
Пример со строкой:
"hello".toUpperCase();
JS делает нечто вроде:
new String("hello").toUpperCase();
→ Создаётся временный объект-обёртка,
→ вызывается метод изString.prototype
,
→ результат возвращается,
→ объект удаляется.Такие обёртки есть для:
String
— для строкNumber
— для чиселBoolean
— для булевых значений
Пример:
let str = "hi"; console.log(str.length); // 2 // str — примитив, но JS делает: new String(str).length
Но если попробовать добавить свойство к примитиву — оно не сохранится:
str.test = "привет"; console.log(str.test); // undefined — потому что обёртка уничтожена
Разница между примитивом и объектом:
let str1 = "hello"; // примитив let str2 = new String("hello"); // объект-обёртка typeof str1; // "string" typeof str2; // "object" str1 == str2; // true (сравнение по значению) str1 === str2; // false (разные типы)
Всегда используй примитивы. Объекты-обёртки — это внутренний механизм, а не инструмент для кода.
Итог:
Что Объяснение Встроенные прототипы Array.prototype
,String.prototype
и др. — хранят методы, которые используют все объекты этого типаЦепочка прототипов Объект ищет метод сначала у себя, потом в __proto__
, потом выше — доObject.prototype
Обёртки для примитивов new String
,new Number
,new Boolean
— временные объекты, которые позволяют вызывать методы на строках, числах и булевых значенияхНо! Примитивы — не объекты. Обёртки создаются автоматически и исчезают после использования - Прототипы — основа наследования в JS.
- Методы у строк и чисел работают благодаря временным объектам-обёрткам.
- Не создавай
new String()
илиnew Number()
вручную — это плохая практика.
-
E evo переместил эту тему из Языки программирования
-
-
-
-
-
-
Все типы данных в javascript
Перенесена JavaScript -
-
© 2025 eduity.ru, Inc. Все права защищены.