04. Объекты

Работа с объектами

Объект

Объект — это множество именованных значений, которые называются свойствами объекта.

Создание объекта при помощи литерала

Объект можно создать при помощи литерала:


var ob = {x:1,y:"январь ",z:true};

Этим кодом создан объект ob с тремя свойствами. Первое свойство с именем x имеет числовое значение, второе с именем y — строковое, третье с именем z — логическое.

Обращение к свойству объекта

Обраться к свойству объекта можно при помощи оператора точка:


ob.x // Равно 1
ob.y // Равно "январь"
ob.z // Равно true

Объект в роли ассоциативного массива

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


ob["x"] // Равно 1
ob["y"] // Равно "январь"
ob["z"] // Равно true

В обычном массиве значения нумеруются целыми положительными числами — индексами. В ассоциативном массиве используются не индексы, а строки, поставленные в соответствие со значениями. Таким образом, ассоциативный массив — это множество пар «строка:значение».

В силу того, что объект — это ассоциативный массив, его свойства можно задавать и в этом синтаксисе. Следующие две записи эквиваленты:


var ob = {x:1,y:"январь",z:true};
var ob = {"x":1,"y":"январь","z":true};

Но вот для такой записи


var ob = {"1x":1,"2x":"январь","3x":true};

не существует эквивалентной замены с именами свойств. Ведь имя не может начинаться с цифры. Однако, запись в синтаксисе ассоциативных массивов допустима и, например,


ob["1x"] // Равно 1

Запись же ob.1x приведет к синтаксической ошибке.

Обращение к объекту, как к ассоциативному массиву, позволяет в качестве ассоциативного индекса использовать выражение, и это часто помогает программированию. Пусть, например, создан объект:


var ob = {x0:10,x1:7,x2:0,x3:8,x4:9,x5:1};

Можно увеличить значения всех свойств на 7 при помощи такого кода:


for(var i=0; i<6;i++) ob["x"+i] += 7;

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

Для того чтобы добавить к объекту новое свойство нужно просто присвоить ему какое-то значение (одновременно свойство создаётся).


var ob = {x:1}; // Объект с одним свойством x
ob.y = 2; // К объекту добавлено свойство y и ему присвоено значение 2.

При обращении к несуществующему свойству объекта возвращается значение undefined.


var ob = {x:1}; // Объект с одним свойством x
ob.z            // Равно undefined

Следующий код устанавливает свойство x в 0, если оно не существует (одновременно и создаётся) или увеличивает значение свойства на 1 в противном случае:


if (ob.x) ob.x++;
else      ob.x = 0; 

Удаление свойств объекта

Для удаления свойств объекта предназначен оператор delete.


delete ob.y // Удаляется свойство y, теперь ob.y равно undefined

Перечисление свойств объекта

Перечислить свойства объекта можно при помощи цикла for/in. Например, следующий код увеличивает на 7 значения всех свойств объекта:


for(var x in ob) ob[x] += 7;

А следующая функция формирует список имен всех свойств объекта, перечисляя их через запятую:


function getNames(y)
{
  var names = "";
  for(var x in y) names += x + ",";
  return names.replace(/,$/, "");
}
var ob = {x0:10,x1:7,x2:0,x3:8,x4:9,x5:1};
var n = getNames(ob); // Равно строке "x0,x1,x2,x3,x4,x5"

Замечание 1. Тело цикла


for (var переменная in объект) тело_цикла

выполняется один раз для каждого свойства объекта. При этом переменной присваивается имя этого свойства в виде строки, то есть для доступа к значению свойства нужно использовать ассоциативный синтаксис: объект[переменная] (а не объект.переменная). Список значений свойств, например, можно получить при помощи такого кода:


function getValues(y)
{
  var values = "";
  for(var x in y) values += y[x] + ",";
  return values .replace(/,$/, "");
}
var ob = {x0:10,x1:7,x2:0,x3:8,x4:9,x5:1};
var n = getValues(ob); // Равно строке "10,7,0,8,9,1"

Замечание 2. Цикл for/in не гарантирует, что свойства объекта будут перечисляться в каком либо определённом порядке.

Выражения в качестве значений свойств объектного литерала

Итак, объект можно создать при помощи литерала, то есть множества заключенных в фигурные скобки пар «имя:значение». Пары отделяются друг от друга запятыми. Имя может быть либо идентификатором, либо строкой. Значение может быть либо константой элементарного типа (как во всех предыдущих примерах), константой объектного типа, либо произвольным выражением. Рассмотрим примеры.


var empty = {}; // Пустой объект (объект без свойств)
var ob = {x:100, y:[1,2], z:{t:3}, t:function(x){return x+1;}};  

Значение первого свойства объекта ob — число. Второго — массив. Третьего — объект. Четвёртого — функция.


ob.x     // Равно 100
ob.y[0]  // Равно 1
ob.z.t   // Равно 3
ob.t(10) // Равно 11

Еще примеры.


var point = {x:100,y:200}; // Объект-точка 
var r = 10;
var circle = {center:point, radius:r}; // Объект-окружность
circle.center.x // Равно 100
circle.center.y // Равно 200
circle.radius   // Равно 10

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

Если значением свойства объекта является функция, то эту функцию называют методом объекта.

Пусть в программе введен объект-прямоугольник:


var rect = {width:10, height:20};

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


function square(ob) { return ob.width*ob.height; }
square(rect); // Равно 200

Можно определить функцию, как свойство самого объекта:


var rect = 
{
  width:10, 
  height:20, 
  square:function() {return this.width*this.height;} 
};
rect.square() // Равно 200