Справочник по 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
Комментарии (0)