Объекты

Предметы из реального мира

Если количество параметров функции растёт, функцию становится труднее читать. Предположим, нам нужно посчитать массу довольно простого предмета — ящика. У ящика есть высота, ширина и длина и есть плотность (в килограммах на метр кубический).

Напишем функцию:

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();

В этой главе мы не будем рассматривать, как создаются объекты в реальных приложениях. Главное — понять, что такое свойства и методы, как ими пользоваться и как получать доступ к свойствам объекта из методов объекта. Создание объектов будет рассмотрено в главе, «Объекты, продолжение».

Задания

  1. Объявите переменную book и назначьте ей объект с именем (name) 'Программирование на Javascript' и типом (type) 'Book'.
  2. Напишите функцию isACat, которая определяет, является ли переданный объект котом. Объект является настоящим котом, если его имя — 'Garphield' или ему нравится молоко. Имя хранится в поле name. Что нравится объекту, хранится в строке, в поле likes. Объекту нравится молоко, если содержимое likes равно строке 'milk'.

results matching ""

    No results matching ""