Что такое Объекты в JavaScript
Объекты (object) – это особенный тип в JS. Остальные типы называются примитивными, потому что значения примитивных типов могут быть только простыми значениями, например, строка или число. В объектах хранятся коллекции или более сложные структуры.
Объект может быть создан с помощью фигурных скобок {...}
с необязательным списком свойств. Свойство – пара ключ-значение, где ключ – строка (имя свойства), а значение может быть чем угодно.
Сравним объект, например, с бейсболкой. У нее есть цвет, форма, вес, материал и т. д. Также и объект JS, содержит свойства, которые определяют его характеристики.
Чаще используют вариант с фигурными скобками {..}
. Такое объявление называют литералом объекта или литеральной нотацией.
Литералы и свойства
Литерал объекта – заключенный в фигурные скобки список свойств (пар имя/значение) через запятую, например: (число(1), строка("строка"), объект({a:1, b:2}))
Имя объекта и имена его свойств чувствительны к регистру. Свойства могут определяться в момент указания их значений, а также с помощью скобочной записи. Неопределенные свойства объекта – undefined
, не null
. Например, создадим бейсболку и зададим ее свойства:
Для удаления свойств можно использовать оператор delete
:
Имя свойства может состоять из нескольких слов, заключенных в кавычки:
Объекты, объявленные как константы (const
), не могут быть изменены. Свойства таких объектов можно менять.
Например:
Ошибки доступа к свойствам
Как писалось выше, попытка обратиться к несуществующему свойству не является ошибкой – будет просто получено значение undefined
. Однако если обратиться к свойству несуществующего объекта, то это будет считаться ошибкой.
Пример:
Для того чтобы защититься от исключения, рассмотрим следующий пример:
Запись значений в свойства, доступные только для чтения к исключению, как правило, не приводят.
Пример:
Когда запись значения свойству объекта будет неудачной:
- Объект имеет собственное свойство, доступное только для чтения.
- Объект имеет унаследованное свойство, доступное только для чтения.
- Объект не имеет ни собственного, ни унаследованного свойства, которое требует изменить атрибут объекта
extensible
и имеет значениеfalse
.
Квадратные скобки
Как описывалось выше, со свойствами можно работать с помощью квадратных скобок. Особенно это полезно для свойств, которые состоят из нескольких слов, например:
При обращении к свойствам объекта с помощью квадратных скобок, можно также задавать, получать и удалять свойства:
Имя свойства могут быть выражениями и могут храниться в переменных, например:
Вычисляемые свойства
Квадратные скобки также используются в литеральной нотации для создания вычисляемого свойства: мы можем задать имя свойства через переменную и потом работать с ним. Например, добавим бейсболке какое-нибудь свойство:
Если вы поэкспериментируете с примером выше и вместо property
зададите какое-нибудь другое значение, то результат будет undefined
.
Квадратные скобки позволяют больше, нежели точка: можно рассчитывать имена свойств во время выполнения кода или задать его извне, как в примере выше.
Свойство из переменной
Возникает необходимость использовать переменные как значения свойств с тем же именем.
Пример:
В примере имена свойств color
и volume
совпадают с именами переменных, подставляемых в значения свойств. Существует синтаксический сахар для упрощенной записи.
Пример:
Можно и еще короче:
Ограничения на имена свойств
В отличие от переменных, для свойств нет ограничений на именование, таких как for
, let
, return
и т. д.
Ограничений для свойств нет также и по типу, т. е. они могут быть заданы строкой или символом, а типы, кроме строк, будут преобразованы к строке.
Пример:
Исключением является специальное свойство __proto__
. Ему нельзя установить не объектное значение:
В этом случае присвоение значения 1
игнорируется.
Проверка существования свойства – оператор in
JavaScript позволяет получить доступ к любому свойству, даже не существующему, в отличие от других языков – ошибки не будет.
При обращении к несуществующему свойству возвращается undefined
. Проверить несуществующее свойство можно следующим образом:
Для проверки существования свойства в объекте используется специальный оператор in
.
Пример:
Слева от оператора in
указывается имя свойства. Если в кавычках, то это имя свойства. Если без кавычек, то это имя переменной, содержащей имя свойства.
Пример:
Оператор in
позволяет определить, что свойство у объекта именно есть, а не то, что его значение undefined
.
Пример:
Данный пример – скорее исключение, в связи с тем, что undefined
обычно не присваивают. Для пустых/неизвестных свойств используют null
.
Цикл for…in
Цикл for...in
используется для перебора всех свойств.
Пример:
В примере name
– переменная, объявленная внутри цикла for
.
Упорядочение свойств объекта
Свойства объекта упорядочены следующим образом: сначала идут целочисленные типы в порядке возрастания, остальные – в порядке создания.
Пример:
Как видим в примере выше, сначала вывелись значения свойства 1
и 3
, а потом значение свойства b
.
Целочисленные свойства – такие свойства, которые могут быть преобразованы в число и обратно.
Пример:
Создание объектов в JavaScript
Создание объектов с помощью оператора new
Оператор new
используется для создания и инициализации нового объекта. После оператора new
указывается имя конструктора (функции, создающей объект).
Примеры встроенных конструкторов:
Также можно создать свой конструктор для инициализации своих объектов.
Пример:
Пример:
Прототипы
Прототип – объект, на основании которого создается другой объект, наследующий его свойства.
Наследование
Наследование – в JavaScript происходит от объекта прототипа. Для наследования свойств одного объекта другим применяется функция inherit()
.
При обращении к свойству объекта, поиск свойства сначала происходит по самому объекту. Если у объекта такого свойства нет, то производится попытка поиска в прототипе, далее в прототипе прототипа и так далее до тех пор, пока не будет найдено свойство, либо не достигнет прототипа, у которого нет прототипа.
Пример:
При присваивании значений свойству объекта проверяется, имеется ли это свойство у объекта или оно унаследовано. При наличии собственного свойства происходит запись значения, а при наличии унаследованного свойства происходит скрытие унаследованного свойства свойством с тем же именем.
При присвоении значения будут проверены все свойства в цепочке прототипов на допустимость. При наследовании свойств только для чтения, присвоение значения производиться для таких свойств не будет.
Пример:
Атрибуты объекта
Объекты JavaScript имеют атрибуты prototype
, class
, extensible
.
Атрибут prototype
Как уже рассматривалось выше, prototype
объекта определяет объект, от которого наследуются свойства. Данный атрибут устанавливается в момент создания объекта.
Атрибут class
Пример:
Функция из примера позволяет определить класс объекта.
Атрибут extensible
Данный атрибут отвечает за возможность добавлять объекту новые свойства. В ECMAScript 3 встроенные и определяемые пользователем объекты неявно допускали возможность расширения, расширяемость объектов среды выполнения определялась конкретной реализацией. В ECMAScript 5 встроенные и определяемые пользователем объекты являются расширяемыми до тех пор, пока не преобразованы в нерасширяемые объект. С объектами среды выполнения ситуация осталась той же.
Пример:
Формат JSON, к сожалению, не может применяться для представления всех возможных значений. Вот некоторые примечание касательно преобразуемых типов:
- Объекты, массивы, строки, конечные числовые значения,
true
,false
поддерживают двустороннее преобразование. NaN
,Infinity
,-Infinity
преобразуются вnull
.Date
преобразуются в строки с датами формата ISO, однако, обратно они восстанавливаются в виде строк.Function
,RegExp
,Error
,undefined
– не могут быть сериализованы или восстановлены.
Комментарии