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

Работа с объектами по 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

};

Ограничения на имена свойств

В отличие от переменных, для свойств нет ограничений на именование, таких как forletreturn и т. д.

let o = {

for: "hello ",

let: "proglib",

return: ".io"

};

alert(o.for + o.let + o.return); // hello proglib.io

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

Report Page