Выбрать главу

В самом низу пищевой цепочки есть тип Object, который закладывает основу как для пользовательских объектов, так и для встроенных типов вроде Function, Array и RegExp. Практически все, за исключением null и undefined, непосредственно связано с Object или может стать им при необходимости.

Как мы уже видели, функциональность, которую предоставляет Object, весьма мала. Он позволяет определять множество именованных пар ключ — значение, которые мы с любовью называем свойствами. Это не особо отличается от того, что мы видим в других языках, использующих хэш-таблицы, ассоциативные массивы и словари.

Как бы то ни было, все это скучно. Мы же собираемся изучать объекты на практике.

Создание объектов

Первое, что мы рассмотрим, — это создание объекта. Для этого существует несколько способов, но все крутые ребята создают их с помощью забавного (но компактного) синтаксиса объектного литерала:

let funnyGuy = {};

Все верно. Вместо написания new Object(), как это делали еще ваши деды, мы можем просто инициализировать наш объект, используя {}. По завершении выполнения этой строки мы получим созданный объект funnyGuy с типом Object:

Создание объектов имеет еще кое-какие особенности кроме только что рассмотренного нами синтаксиса объектного литерала, но их мы рассмотрим в более подходящее время.

Добавление свойств

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

Продолжим с нашего объекта funnyGuy:

let funnyGuy = {};

Предположим, мы хотим добавить свойство firstName и задать ему значение Conan. Добавление свойства в данном случае производится с помощью синтаксиса записи через точку:

funnyGuy.firstName = "Conan";

Вот и все. После добавления свойства мы можем обращаться к нему посредством того же синтаксиса:

let funnyFirstName = funnyGuy.firstName;

Альтернатива записи через точку

Для определения считывания свойств мы использовали подход, называемый записью через точку. Но у него есть альтернатива, использующая вместо точки скобки:

let funnyGuy = {};

funnyGuy["firstName"] = "Conan";

funnyGuy["lastName"] = "O'Brien";

Какой из этих подходов использовать, решать только вам (или команде), но есть определенные случаи, для которых предназначены именно скобки. Имеются в виду случаи, когда мы работаем со свойствами, чьи имена нам нужно генерировать динамически. В примере же с firstName и lastName мы прописали их статично. Взгляните на следующий фрагмент кода:

let myObject = {};

for (let i = 0; i < 5; i++) {

let propertyName = "data" + i;

myObject[propertyName] = Math.random() * 100;

}

Мы имеем объект myObject — обратите внимание на то, как мы устанавливаем его свойства. У нас нет статичного списка имен свойств, вместо этого мы создаем имя свойства, опираясь на значение индекса массива. Когда мы выясняем имя свойства, то используем эти данные для создания свойства в myObject. Генерируемые именами свойств будут data0, data1, data2, data3 и data4. Эта возможность динамического определения имени свойства в процессе изменения или чтения объекта оказывается доступной благодаря именно скобочному синтаксису.

Теперь, прежде чем продолжить, давайте добавим еще одно свойство, назовем его lastName и присвоим ему значение O’Brien:

funnyGuy.lastName = "O'Brien";

К этому моменту мы уже в хорошей форме, а наш полный код funnyGuy выглядит следующим образом:

let funnyGuy = {};

funnyGuy.firstName = "Conan";

funnyGuy.lastName = "O'Brien";

При его выполнении будет создан объект funnyGuy, и в нем будут определены два свойства — firstName и lastName.

Мы только что рассмотрели, как пошагово создавать объект и устанавливать для него свойства. Если же мы изначально знаем, какие свойства должны быть в объекте, то можем объединить некоторые шаги:

let funnyGuy = {

firstName: "Conan",

lastName: "O'Brien"

};

Конечный результат в таком случае будет идентичен предыдущему, в котором мы сперва создали объект funnyGuy и лишь затем определили в нем свойства.

Есть и еще одна деталь, касающаяся добавления свойств, на которую стоит обратить внимание. К текущему моменту мы рассмотрели различные объекты, имеющие свойства, чьи значения состоят из чисел, строк и т. д. А вы знали, что свойством объекта может являться другой объект? Это вполне возможно! Взгляните на следующий объект colors, чье свойство content содержит объект: