Объявление объектов

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