01. Данные

Объекты-обёртки

Классы-обёртки

Числа, строки и логические значения относятся к элементарным типам. Это не объекты. Но, тем не менее, в языке JavaScript есть классы Number, String и Boolean, которые поддерживают элементарные типы ланных набором встроенных свойств и методов.

В объектно-ориентированных языках программирования классами называют шаблоны, предназначенные для создания объектов (экземпляров класса). В JavaScript нет «настоящих» классов, но об этом мы поговорим позже.

Мы можем, например, записать:


"Роботландия".length     // Равно 11
"Роботландия".charAt(0)  // Равно "Р"
"Робот".concat("ландия") // Равно "Роботландия"

Посмотрите, к строке идёт обращение, как к объекту с использованием точечного синтаксиса. В первом случае прочитано значение свойства length (длина строки), во втором — вызван метод charAt(n) (возвращает n-й символ строки), в третьем — вызван метод concat(str) (объединяет строку со своим аргументом).

Свойство length, методы charAt(n) и concat(str) принадлежат встроенному в язык классу String. Как же можно применять их к строкам, которые не являются объектами? Можно. Дело в том, что всякий раз, когда мы пишем нечто вроде "Роботландия".length, интерпретатор JavaScript превращает строку в объект (создаёт экземпляр класса String) и именно к этому объекту применяет свойство length, после чего временный объект уничтожается.

Таким образом, данные элементарного типа в нужный момент автоматически превращаются в объекты, «оборачиваясь» свойствами и методами соответствующего класса. Классы Number, String и Boolean служат для создания «обёрток» элементарных типов данных (хотя их можно использовать и как обычные классы, создавая из них объекты с помощью оператора new).

Итак, когда строка (или другой элементарный тип) используется в объектном контексте, то есть когда идёт обращение к свойству или методу класса String, Number или Boolean, JavaScript создаёт соответствующий объект-обёртку. После завершения операции, объект-обёртка уничтожается.

Пример с числами:


var x = 45.7777777;
var y = x.toPrecision(4);  // y равен "45.78"

К числу, которое хранится в переменной x, применяется метод toPrecision(точность) класса Number, который возвращает строковое представление числа, содержащее количество цифр, определяемое аргументом точность. Можно написать и так:


45.7777777.toPrecision(4) // Равно "45.78"

Такая запись смотрится довольно непривычно и не всегда проходит синтаксический контроль, например:


45.toPrecision(4) // Синтаксическая ошибка

Поэтому не рекомендуется применять методы обертки Number к числовым литералам (а для строк это обычная практика).

Можно записать:


true.toString(); // Равно строке "true"

Обёртка Boolean наименее интересна. Класс Boolean содержит только два метода: toString() и valueOf() — первый преобразует логическое значение в строку, второй — преобразует объект в значение элементарного типа, то есть в true или false.