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

На основе статьи

Все объекты можно условно разделить на несколько видов:

  1. глобальный объект;
  2. объектные типы:
    • собственно объекты (коллекции свойств и их значений);
    • массивы (коллекции данных, упорядоченных в виде списка элементов);
    • функции (фрагменты программного кода (подпрограммы), позволяющие формализовать определённую логику поведения и обработки данных). 
  3. объекты-обертки.

Все примитивы в JavaScript (например, Number, String, Boolean и т.д.) не имеют свойств. Примитивный тип данных является простым строительным блоком языка. По сути, это значение, и как таковое оно не имеет свойств.

Однако рассмотрим следующий код:

Похоже, что str явно имеет свойство toUpperCase . Но если строки - примитивы и не являются объектами, то почему они имеют такие свойства, например, как toUpperCase, toLowerCase и т. д.?

Всякий раз, когда мы пытаемся получить доступ к свойству строки str, JavaScript приводит значение строки к объекту с помощью конструктора new String(str). Этот объект называется объектом-оберткой. Он наследует все методы объекта String (посмотреть которые можно через console.dir(String); ) и используется для разрешения ссылки на свойство глобального объекта String. После разрешения вызванного свойства объект-оболочка отбрасывается. Эта же концепция применима к числам (number) и логическим значениям (boolean).

По указанной выше причине следующий фрагмент кода вернет undefined:

Разбор примера

  1. Строка 1. Инициализируется переменная str = 'привет'; 
  2. Строка 2. JavaScript создает объект-оболочку String, устанавливает его пользовательское свойство custom = 1, а затем отбрасывает его. По сути, он работает примерно так:

    Если вывести temp в Firebug, Chrome Developer Toolbar или любом другом инструменте отладки, то увидим что-то вроде:

    Как можно видеть, настраиваемое свойство устанавливается для временного объекта-оболочки.

  3. Строка 3. console.log (str.custom); JavaScript создает объект String - обертку для исходного строкового значения, а затем пытается прочитать custom - свойство, которое не существует. Возвращается результат undefined. Объект-оболочка снова отбрасывается.

[свернуть]

Обычно объекты-обертки можно рассматривать просто как особенность реализации JavaScript: достаточно знать, что строки, числа и логические значения отличаются от объектов тем, что их свойства доступны только для чтения и что вы не можете определять для них новые свойства (см. пример выше).

Cуществует возможность (но в этом почти никогда нет необходимости или смысла) явно создавать объекты-обертки вызовом конструктора String(), Number() или Boolean():

При необходимости интерпретатор JavaScript обычно автоматически преобразует объекты-обертки, т. е. объекты S, N и В в примере выше, в обертываемые ими простые значения примитивов, но они не всегда ведут себя точно так же, как значения s, n и b:

  • нестрогое равенство == будет обрабатывать примитив и его объект-оболочку как равные;
  • строгое равенство === будет рассматривать примитив и его объект-оболочку как разные объекты.

Примеры для string и number:

Однако когда дело доходит до number, JavaScript дает вам больше свободы: вы можете создавать свои собственные объекты number, и позволить приведению типа разрешить любую числовую операцию за вас. Например:

Как видно из приведенного выше кода, сложение привело объекты x и y к примитивным значениям. JavaScript знает каково примитивное значение моего числового объекта, потому что он ищет и выполняет метод valueOf. Пока этот метод есть в созданном вами объекте (и предполагается, что он возвращает число), ваш объект может быть математически обработан (хотя, вы должны быть предупреждены, у объекта Number, конечно, есть больше методов, чем просто valueOf , например toExponential , toFixed , toLocaleString , toPrecision и toString ).

См. также Преобразование типов в JavaScript

Помните, что вызов конструктора Number без оператора new пытается преобразовать значение в его примитивное представление. То же самое касается String и Boolean.

Значения null и undefined не имеют объектов-оберток: любые попытки обратиться к свойствам этих значений будет вызывать ошибку ТуреError.

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.