Справочник по JavaScript. Объекты
Объявление объектов
var a = new Object(); // Устаревший синтаксис
var a = {}; // Объявление пустого объекта
var a = { title: "test", size: 22 }; // Объявление и инициализация объекта
Свойства могут задаваться в виде строк, даже из нескольких слов. В качестве значения свойства может быть другой объект или функция:
var a = {
size: 22,
"title of page": "test",
user: { name: "Mike", age: 20 },
check: function(){
return user.age > 16;
}
};
Объект может быть создан через функцию. В этом случае функция считается конструктором объекта:
function Action(title){
this.title = title;
}
var obj = new Action("test"); // Action { title: "test" }
Функция-конструктор может быть анонимной:
var obj = new function(){
this.title = "test";
}; // { title: "test" }
Функция-конструктор не должна, но может возвращать объект через return. В этом случае в результате вызова функции будет возвращенный объект. Если функция возвратит примитивный тип, то он проигнорируется и вернется объект.
function Action(title){
this.title = title;
return { name: "Mike" };
}
var obj = new Action("test"); // { name: "Mike" }
Работа со свойствами объекта
Добавление свойства в объект
var a = {};
a.title = "Название"; // { title: "Название" }
Удаление свойства из объекта
var a = { title: "test", size: 22 };
delete a.title; // { size: 22 }
Доступ к свойствам объекта
var a = { title: "test", size: undefined };
var b = a.title; // "test"
// Через квадратные скобки можно обращаться к свойству,
// заданному в виде строки, либо заданному через переменную
var s = "title";
var b = a.s; // undefined
var b = a[s]; // "test"
var b = a["title"]; // "test"
a["title of page"] = "test";
var b = a["title of page"]; // "test"
Перебор свойств объекта
for(var key in obj) {
console.log(obj[key]);
}
Поверка существования свойства в объекте
var a = { title: "test", size: undefined };
var b = "title" in a; // true
var b = a.title === undefined // false
var b = "size" in a; // true
var b = a.size === undefined // true
var b = a.ttt === undefined // true. Даже если свойства в объекте нет, ошибки не будет
Методы объектов
В объектах можно также указывать функции - методы объекта. Доступ к данным объекта из таких функций может быть получен через переменную this.
var obj = {
amount: -5,
getAmount() { return this.amount; },
getDoubleAmount: function() { return this.amount * 2; }
};
obj.getAbsAmount = function() { return Math.abs(this.amount); }
console.log(obj.getAmount()); // -5
console.log(obj.getDoubleAmount()); // -10
console.log(obj.getAbsAmount()); // 5
Геттеры / Сеттеры
В объекте можно задать методы с использованием ключевых слов get и set. В этом случае к заданным методам можно будет обращаться как к обычным свойствам объекта.
var obj = {
amount: 5,
get doubleAmount() { return this.amount * 2; },
set doubleAmount(val) { this.amount = val / 2; }
};
console.log(obj.amount); // 5
console.log(obj.doubleAmount); // 10
obj.doubleAmount = 60;
console.log(obj.amount); // 30
Преобразования объектов в примитивные типы
Объекты могут быть преобразованы в три примитивных типа: в строку, в число, в логический тип.
Преобразование в логический тип
В этом случае объект - это всегда значение true
var obj = {};
if(obj) console.log('object == true'); // всегда true
Преобразование в строку
По-умолчанию преобразование объекта в строку возвращает значение "[object Object]". Используя метод toString, можно переопределить это значение.
var obj = { id: 10 };
console.log('' + obj); // [object Object]
obj.toString = function() {
return 'MyObject (ID = ' + this.id + ')';
};
console.log('' + obj); // MyObject (ID = 10)
Встроенные объекты, такие как Date, Array, Function, имеют свои реализации метода toString, отображающие содержимое объектов в строковом виде.
Если у объекта существует метод valueOf, то он используется для вывода значения.
Преобразование в число
Для преобразования в число используется метод valueOf. Если такого метода у объекта нет, используется toString.
var obj = { id: 10, valueOf: function() { return this.id } };
console.log(100 + obj); // 110
console.log('100' + obj); // '10010'
Защита объектов
Предотвращение расширения объекта
Метод Object.preventExtensions позволяет запретить расширять объект, добавлять в него новые свойства и методы. Попытка добавить новое свойство после вызова данного метода либо молча не сработает, либо выдаст ошибку (как правило в строгом режиме). Использование этого метода, однако, не запрещает изменять существующие свойства, позволяет удалять свойства объекта, либо расширять прототип объекта.
Проверить объект на возможность его расширения можно с помощью метода Object.isExtensible
var obj = { a: 1 };
console.log(obj); // { a: 1}
console.log(Object.isExtensible(obj)); // true
Object.preventExtensions(obj);
obj.val = 10;
delete obj.a;
console.log(obj); // {}
console.log(Object.isExtensible(obj)); // false
"Запечатывание" объекта
Метод Object.seal позволяет запретить добавлять и удалять свойства и методы в объекте. Попытка добавить, либо удалить свойство после вызова данного метода не сработает, либо выдаст ошибку (как правило в строгом режиме). Использование этого метода не запрещает изменять существующие свойства и не затрагивает прототип объекта.
Проверить, не запечатан ли объект, можно с помощью метода Object.isSealed
var obj = { a: 1 };
console.log(obj); // { a: 1 }
console.log(Object.isSealed(obj)); // false
Object.seal(obj);
obj.val = 10;
delete obj.a;
console.log(obj); // { a: 1 }
console.log(Object.isSealed(obj)); // true
"Замораживание" объекта
Метод Object.freeze позволяет запретить любое изменение свойств и методов объекта. Попытка изменить свойства объекта после вызова данного метода не сработает, либо выдаст ошибку (как правило в строгом режиме). Использование этого метода не запрещает работать геттерам и сеттерам - через них можно менять свойства объекта. Также заморозка не действует на объекты-значения свойств, для них требуется делать свою заморозку.
Проверить, не заморожен ли объект, можно с помощью метода Object.isFrozen
var obj = { a: 1 };
console.log(obj); // { a: 1 }
console.log(Object.isFrozen(obj)); // false
Object.freeze(obj);
obj.a = 10;
delete obj.a;
console.log(obj); // { a: 1 }
console.log(Object.isFrozen(obj)); // true