Работа с объектами по JavaScript
Что такое Объекты в JavaScript
Объекты (object) – это особенный тип в JS. Остальные типы называются примитивными, потому что значения примитивных типов могут быть только простыми значениями, например, строка или число. В объектах хранятся коллекции или более сложные структуры.
Объект может быть создан с помощью фигурных скобок {...} с необязательным списком свойств. Свойство – пара ключ-значение, где ключ – строка (имя свойства), а значение может быть чем угодно.
Сравним объект, например, с бейсболкой. У нее есть цвет, форма, вес, материал и т. д. Также и объект JS, содержит свойства, которые определяют его характеристики.
let cap = new Object(); //конструктор объекта
let cap = new {}; //литерал объекта
let cap = Object.create({}); //создание объекта определенное стандартом ECMAScript 5
Чаще используют вариант с фигурными скобками {..}. Такое объявление называют литералом объекта или литеральной нотацией.
Литералы и свойства
Литерал объекта – заключенный в фигурные скобки список свойств (пар имя/значение) через запятую, например: (число(1), строка("строка"), объект({a:1, b:2}))
object.property
Имя объекта и имена его свойств чувствительны к регистру. Свойства могут определяться в момент указания их значений, а также с помощью скобочной записи. Неопределенные свойства объекта – undefined, не null. Например, создадим бейсболку и зададим ее свойства:
var cap = new Object();
cap.color = "Red";
cap["volume"] = 300;
Для удаления свойств можно использовать оператор delete:
delete cap.color;
Имя свойства может состоять из нескольких слов, заключенных в кавычки:
let cap = {
background: "Red",
"has image": true
}
Объекты, объявленные как константы (const), не могут быть изменены. Свойства таких объектов можно менять.
Например:
const cap = {
color: "Red"
}
cap.color = "Green"; // допустимо
alert(cap.color); // Green
cap = new Object(); // Ошибка
Ошибки доступа к свойствам
Как писалось выше, попытка обратиться к несуществующему свойству не является ошибкой – будет просто получено значение undefined. Однако если обратиться к свойству несуществующего объекта, то это будет считаться ошибкой.
Пример:
var cap = { Color: "Red", Volume: 300 };
var a = cap.Text; // undefined
var b = cap.Text.length; // Ошибка TypeError
Для того чтобы защититься от исключения, рассмотрим следующий пример:
// Наглядный и понятный вариант
var b = undefined;
if (cap) {
if (cap.Text)
{
b = cap.Text.length;
}
}
Запись значений в свойства, доступные только для чтения к исключению, как правило, не приводят.
Пример:
Object.prototype = {}; // исключения не будет, прототип не изменится
Когда запись значения свойству объекта будет неудачной:
- Объект имеет собственное свойство, доступное только для чтения.
- Объект имеет унаследованное свойство, доступное только для чтения.
- Объект не имеет ни собственного, ни унаследованного свойства, которое требует изменить атрибут объекта
extensibleи имеет значениеfalse.
Квадратные скобки
Как описывалось выше, со свойствами можно работать с помощью квадратных скобок. Особенно это полезно для свойств, которые состоят из нескольких слов, например:
cap.has image = true; // ошибка
cap["has image"] = true; // корректно
При обращении к свойствам объекта с помощью квадратных скобок, можно также задавать, получать и удалять свойства:
cap["color"] = "Red"; // присвоить значение свойству
alert(cap["color"]); // получить значение свойства
delete cap["color"]; // удалить свойство
Имя свойства могут быть выражениями и могут храниться в переменных, например:
let propertyName = "color";
cap[propertyName] = "Red";
Вычисляемые свойства
Квадратные скобки также используются в литеральной нотации для создания вычисляемого свойства: мы можем задать имя свойства через переменную и потом работать с ним. Например, добавим бейсболке какое-нибудь свойство:
let newProperty = prompt("Задайте имя нового свойства", "property");
let cap = {
[newProperty]: 1,
};
alert(cap.property);// 1 если newProperty = "property"
Если вы поэкспериментируете с примером выше и вместо property зададите какое-нибудь другое значение, то результат будет undefined.
Квадратные скобки позволяют больше, нежели точка: можно рассчитывать имена свойств во время выполнения кода или задать его извне, как в примере выше.
Свойство из переменной
Возникает необходимость использовать переменные как значения свойств с тем же именем.
Пример:
function makeCap(color, volume){
return {
color: color,
volume: volume
};
}
let cap = makeCap("Red", 500);
alert(cap.color); // Red
В примере имена свойств color и volume совпадают с именами переменных, подставляемых в значения свойств. Существует синтаксический сахар для упрощенной записи.
Пример:
function makeCap(color, volume){
return {
color,
volume
};
}
Можно и еще короче:
let cap = {
color,
volume: 500
};
Ограничения на имена свойств
В отличие от переменных, для свойств нет ограничений на именование, таких как for, let, return и т. д.
let o = {
for: "hello ",
let: "proglib",
return: ".io"
};
alert(o.for + o.let + o.return); // hello proglib.io
Ограничений для свойств нет также и по типу, т. е. они могут быть заданы строкой или символом, а типы, кроме строк, будут преобразованы к строке.