07. Объекты

Объекты в реальном мире

В реальном мире нас окружают разнообразные объекты: «дом», «автобус», «новогодняя ёлка» и так далее. Все это мы можем назвать одним словом – объекты.

Все эти объекты мы можем классифицировать исходя из их свойств (здания, автомобили, деревья), то есть мы можем объединить разные объекты (грузовой автомобиль и автобус) в класс «автомобили» потому что их основные свойства одинаковы.

Но мы можем пойти еще дальше и объединить классы объектов, например (автомобили и мотоциклы) в класс транспорт.

Классификация объектов

И так давайте рассмотрим, что происходит при при объединении объектов в классы. Есть две машины (mazda, красная) и (honda, синяя).

Если рассматривать эти машины, то они имеют конкретную марку и конкретный цвет. Но при рассмотрении класса «легковые автомобили» мы можем сказать только то что каждый экземпляр в этом классе имеет какой-то свой цвет и какую то свою марку, НО мы можем сказать точно, что все легковые машины имеют по 4 колеса.

Другими словами класс объектов говорит о наличии свойств у объектов но значение каждого из свойств нам не известно.

Так же класс объектов может содержать какую-то дополнительную информацию об объектах (у всех легковых машин по 4 колеса).

Классификация классов

Если мы попытаемся объединить классы (легковые автомобили, грузовые автомобили и мотоциклы) в более общий класс «транспорт» – то информации о каждом объекте у нас будет еще меньше: цветмарка, «наличие колес» (но вот сколько колес уже не известно).

Таким образом если объединять разные категории объектов во все более общие и общие понятия, то в конце концов мы дойдем до абстрактного общего класса «Объекты» который нам говорит о том, что у представителя этого класса есть какие-то свойства, а какие точно он сказать не может.

Объекты в JavaScript

В JavaScript ситуация очень похожая: объекты имеют разные свойства как и в жизни.

Если объект не относится ни к какому определенному классу, то значит, что он просто является представителем самого общего класса Объект (Object);

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

Создавать объекты можно двумя способами: с помощью конструктора:

let someObject = new Object();

Или с помощью литерала:

let anotherObject = {};

В примерах создаются пустые объекты, но при создании ему сразу можно задать какие-то свойства:

let user = {
  name: 'Sasha',
  age: 42
}

Также мы можем добавлять свойства объекту уже после его создания:

user.isAdmin = false;

Немного подробнее по последнему примеру. Обращение к свойствам объекта происходит через точку после имени объекта. Таким образом мы создаем новое свойство и присваиваем ему значение.

Попробуем посмотреть что у нас вышло с последним примером:

console.log(user.name); // Sasha
console.log(user.age); // 42
console.log(user.isAdmin); // false

Методы объекта

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

Такие действия в JavaScript представлены свойствами-функциями объекта.

let user = {
  name: 'Sasha',
  age: 42
}

user.sayHello = function() {
  console.log('Hello!');
} 

user.sayHello();

Ключевое слово «this»

Как правило, методу объекта необходим доступ к информации, которая хранится в объекте, чтобы выполнить с ней какие-либо действия.

Для доступа к информации внутри объекта метод может использовать ключевое слово this.

Значение this – это объект «перед точкой», который использовался для вызова метода.

let user = {
  name: 'Sasha',
  age: 42,
  sayHello() {
    console.log(this.name);
  }
}

user.sayHello();

Преобразование объектов в примитивы

Все объекты в логическом контексте являются true. Существуют лишь их численные и строковые преобразования.

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

Что касается строковых преобразований – они обычно происходят, когда мы выводим объект alert(obj), а также в других случаях, когда объект используется как строка.

Конструкторы

Конструктор объекта позволяет создавать новый объект на основе существующего «шаблона» с заданными свойствами. Например, создадим функцию для создания объекта:

function Dog(name) {
  this.name = name;
  this.age = 2;
}

let someDog = new Dog('Tuzik');

console.log(someDog.name); // Tuzik
console.log(someDog.age); // 2