Объектная модель JavaScript
JavaScript - это объектно-ориентированный язык. Это значит, что основными элементами языка являются объекты
. Каждый объект характеризуется набором свойств и методов. Свойства содержат определенную информацию об объекте, которую в большинстве случаев можно менять. Значением свойства могут быть примитивные значения или другие объекты. Методы - это вызываемые действия с объектами, которые можно выполнить как функции. Как и для функций, вызов метода происходит при добавлении круглых скобок к имени метода. Фактически методы тоже являются свойствами, но их принято называть методами
, чтобы сразу понимать, о чем идет речь. JavaScript и браузер имеют встроенные объекты, а также пользователь может создавать свои собственные.
Создание объектов
Создать объект можно, используя встроенные в язык объекты-конструкторы. Каждый конструктор обладает определенными свойствами и методами. Созданный объект сразу получает некоторые свойства, определенные конструктором.
Оператор new
Для вызова конструктора используется оператор new
:
var date = new Date(); /* объект класса Date */ var arr = new Array(); /* объект класса Array */
Для создания пустого объекта используется базовый конструктор Object
. Можно воспользоваться одним из способов:
var obj_1 = new Object(); /* пустой объект класса Object */ var obj_2 = {}; /* пустой объект класса Object */
Второй способ создания объекта предпочтительнее, так как он новее и короче.
Оператор instanceof
С помощью оператора instanceof
можно проверить, является ли объект наследником того или иного класса. Оператор возвращает значение булевого
типа.
var date = new Date(); alert(date instanceof Date); // true alert(date instanceof Array); // false
Свойства и методы
При создании объекту можно сразу присвоить свойства и методы. Они перечисляются через запятую в формате свойство: значение
:
var address = { street: 'Заречная', house: 101 };
В данном примере street и house - это свойства объекта address. Их можно указывать в кавычках:
var address = { 'street': 'Заречная', "house": 101 };
Обращение к свойству или методу объекта происходит через точку:
var address = { street: 'Заречная', house: 101, distanceTo: function() { alert('Расчет расстояния...'); } }; alert(address.street); alert(address.distanceTo); address.distanceTo();
В данном примере distanceTo - это метод объекта address. При обращении без скобок distanceTo ведет себя как свойство. При добавлении скобок метод выполняется.
Если обратиться к несуществующему свойству объекта, JavaScript не выдаст ошибку (как в случае с переменными), а вернет undefined
.
Новое свойство (метод) объекта создается операцией присвоения:
var car = {}; /* создан пустой объект car */ car.color = 'red'; /* добавлено свойство color со значением 'red' */
Переменная this
Если обращение к свойствам происходит внутри самого объекта, то вместо имени объекта можно использовать переменную this
. В ней содержится ссылка на текущий объект. Это позволяет избавиться от необходимости полностью пересматривать код в случае смены имени объекта.
var address = { street: 'Заречная', distanceTo: function() { alert('Расчет расстояния до ' + this.street); } }; address.distanceTo();
Оператор in
Наличие свойства у объекта проверяется оператором in
. Записывается так
, где 'prop' in obj
'prop'
- это искомое свойство (обязательно должно быть в кавычках), а obj
- это объект, в котором идет поиск. Оператор возвращает значение true
, если свойство найдено, или false
в противном случае.
var car = { color: 'red' }; if ('color' in car) alert('Свойство color: ' + car.color);
Оператор delete
Для удаления свойств (методов) объектов используется оператор delete
. Оператор возвращает true
, если удаление прошло успешно, или false
в противном случае.
var car = { color: 'red' }; if ('color' in car) alert('Свойство color: ' + car.color); delete car.color; if (!('color' in car)) alert('Свойство удалилось');
К свойствам и методам можно обращаться с использованием квадратных скобок:
address['street'] /* сработает как address.street */ address['distanceTo']() /* сработает как address.distanceTo() */
Строка в квадратных скобках содержит имя свойства. Это позволяет использовать различные имена свойств:
address['street or avenue'] /* сработает только в таком виде */
Имя может быть помещено в переменную. Это используется в случаях, когда, например, имя свойства создается пользователем, а не разработчиком.
var prop = 'street'; alert(address[prop]); /* сработает только в таком виде */
В последних двух примерах обратиться к свойству объекта через точку не получится.
Перебор свойств, цикл for…in
Для перебора свойств объектов используется специальный цикл for…in
. Записывается так:
for (prop in obj) { /* тело цикла */ };
Условием выполнения цикла является наличие свойства у объекта. Цикл выполняется до тех пор, пока не переберет все свойства. В переменную prop помещается имя свойства. Соответственно, если врутри цикла потребуется обратиться к данному свойству, то нужно использовать запись с квадратными скобками obj[prop]
.
var address = { street: 'Заречная', house: 101 }; for (var prop in address) { alert(prop + ' - ' + address[prop]); }