Объекты
Предметы из реального мира
Если количество параметров функции растёт, функцию становится труднее читать. Предположим, нам нужно посчитать массу довольно простого предмета — ящика. У ящика есть высота, ширина и длина и есть плотность (в килограммах на метр кубический).
Напишем функцию:
var getBoxMass = function(height, width, length, density) {
var volume = height * width * length; // Вычисляем объём
return density * volume; // Умножаем на плотность
};
Вроде всё просто. Но что будет, если количество учитываемых параметров вырастет до 10
? Код функции, заголовок которой уходит за правый край экрана — тот ещё источник ошибок и боли при их поиске.
Javascript позволяет нам объединить набор свойств объекта реального мира внутри специальной конструкции, которая так и называется — объект.
Вот так мог бы выглядеть объект-коробка, с необходимыми нам свойствами:
var box = {
height: 5,
width: 40,
length: 200,
density: 1
};
// Получим значения свойств:
box.height // => 5
box.density // => 1
// А можно ещё и вот так:
box['height'] // => 5
box['width'] // => 40
Теперь перепишем функцию getBoxMass
так, чтобы она принимала один параметр — «коробку» и вычисляла для неё массу:
var getBoxMass = function(box) {
var volume = box.height * box.width * box.length; // Вычисляем объём
return box.density * volume; // Умножаем на плотность
};
Методы
Кроме свойств хранящих значения, объект может иметь методы — свойства-функции. Такие функции могут быть вызваны, чтобы получить значение, вычисляемое из данных, которые хранятся в объекте, либо чтобы изменить значения, хранимые в объекте.
Пример вычисляемого значения — получение массы из габаритов и плотности коробки:
var box = {
height: 5,
width: 40,
length: 200,
density: 1,
getMass: function() {
var volume = this.height * this.width * this.length;
return volume * this.density;
}
};
box.getMass(); // => 40000
Обратите внимание на использование ключевого слова this
— таким образом мы получаем внутри функции доступ к свойствам объекта (текущей коробки).
Пример функции, изменяющей свойства объекта — установка плотности коробки:
var box = {
height: 5,
// ...
setDensity: function(_density) {
this.density = _density;
}
};
box.setDensity(2);
box.getMass(); // => 80000
Ссылки на другие объекты
Кроме обычных значений (числовых, строковых, логических) и методов, свойства могут содержать ссылки на другие объекты. Например, две коробки, стоящие рядом друг с другом, могли бы ссылаться друг на друга вот так:
// Задаём содержимое коробок
var box1 = { ... };
var box2 = { ... };
// Соединяем коробки между собой
box1.right = box2;
box2.left = box1;
Если нам нужно узнать общий вес box1
и коробки, стоящей справа от неё, этих данных будет вполне достаточно (при условии, что обе коробки имеют метод getMass
):
// Получаем общую массу:
box1.getMass() + box1.right.getMass();
В этой главе мы не будем рассматривать, как создаются объекты в реальных приложениях. Главное — понять, что такое свойства и методы, как ими пользоваться и как получать доступ к свойствам объекта из методов объекта. Создание объектов будет рассмотрено в главе, «Объекты, продолжение».
Задания
- Объявите переменную
book
и назначьте ей объект с именем (name
)'Программирование на Javascript'
и типом (type
)'Book'
. - Напишите функцию
isACat
, которая определяет, является ли переданный объект котом. Объект является настоящим котом, если его имя —'Garphield'
или ему нравится молоко. Имя хранится в полеname
. Что нравится объекту, хранится в строке, в полеlikes
. Объекту нравится молоко, если содержимоеlikes
равно строке'milk'
.