JavaScript объекты

Создание объекта

Обычно объект создают литералом {}. Object(value) возвращает переданный объект без копирования, оборачивает примитив, а для null и undefined создаёт пустой объект. Свойства имеют строковые или символьные ключи. Методы прототипа могут быть перекрыты собственными свойствами.

Ниже отдельно перечислены собственные статические методы Object и методы его прототипа. Общие унаследованные возможности других объектов в таблицы не включены.

Статические методы Object

Статические методы Object
Метод Описание
assign() Метод позволяет произвести поверхностное копирование значений всех перечислимых собственных свойств и методов из одного или нескольких исходных объектов в целевой объект.
create() Позволяет создать новый объект с указанным объектом прототипом и при необходимости свойствами, описываемые дескрипторами.
defineProperties() Позволяет определить новые или изменить существующие свойства объекта, описывая их дескрипторами.
defineProperty() Позволяет определить новое или изменить существующее свойство объекта, описывая его дескрипторами.
entries() Позволяет возвратить массив, содержащий собственные перечислимые свойства и методы заданного объекта, включая их значения, при этом по каждому свойству или методу с его значением создается отдельный массив.
freeze() Запрещает расширение объекта и настройку его собственных свойств; собственные свойства данных становятся недоступны для записи. Заморозка поверхностная.
getOwnPropertyDescriptor() Возвращает объект дескриптор для указанного собственного (неунаследованного) свойства заданного объекта.
getOwnPropertyDescriptors() Позволяет возвратить объект, содержащий дескрипторы всех собственных (неунаследованных) свойств заданного объекта.
getOwnPropertyNames() Метод возвращает массив, состоящий из всех имен собственных (неунаследованных) свойств и методов объекта (включая неперечислимые свойства и методы).
getOwnPropertySymbols() Метод возвращает массив, состоящий из всех символьных (Symbol) свойств переданного объекта (массив символов конкретного объекта).
getPrototypeOf() Метод возвращает прототип переданного объекта.
is() Метод возвращает логическое значение, которое определяет являются ли два переданных значения одинаковыми.
isExtensible() Метод возвращает логическое значение, которое определяет является ли объект расширяемым (доступно добавление новых собственных свойств), или нет.
isFrozen() Позволяет вернуть логическое значение, которое определяет является ли объект нерасширяемым с недоступными для настройки и изменения свойствами.
isSealed() Метод возвращает логическое значение, которое определяет является ли объект нерасширяемым и с недоступными для настройки свойствами, или нет.
keys() Позволяет вернуть массив, содержащий имена всех собственных (неунаследованных) перечислимых свойств и методов указанного объекта.
preventExtensions() Позволяет сделать объект нерасширяемым (предотвращает добавление новых собственных (неунаследованных) свойств).
seal() Позволяет сделать объект нерасширяемым (предотвращает добавление новых собственных (неунаследованных) свойств), а также устанавливает все его собственные свойства как ненастраиваемые (предотвращает их удаление и изменение дескриптора).
setPrototypeOf() Метод позволяет установить или изменить прототип указанному объекту.
values() Метод возвращает массив собственных перечислимых значений свойств и методов указанного объекта.
fromEntries() Создаёт объект из итерируемых пар [ключ, значение]. Поддерживает строковые и символьные ключи; повторный ключ перезаписывается. Возвращает новый объект.
groupBy() Группирует элементы итерируемого источника по ключу, возвращённому callback(element, index). Возвращает объект без прототипа с массивами групп. Элементы не клонируются; ключ приводится к строке или Symbol.
hasOwn() Возвращает boolean: есть ли собственное свойство с заданным строковым или символьным ключом, включая неперечислимое и имеющее значение undefined. Работает с объектами без прототипа и перекрытым hasOwnProperty.

Методы экземпляра Object

Методы экземпляра Object
Метод Описание
hasOwnProperty() Метод возвращает логическое значение, которое указывает на то содержит ли объект указанное собственное (неунаследованное) свойство, или метод.
isPrototypeOf() Проверяет существует ли указанный объект в цепочке прототипов другого объекта, возвращая при этом логическое значение.
propertyIsEnumerable() Возвращает логическое значение, которое определяет является ли указанное свойство или метод целевого объекта перечислимым.
toLocaleString() Вызывает this.toString(). Локализацию для конкретного типа обеспечивают его переопределения.
toString() Метод возвращает строковое представление указанного объекта.
valueOf() Базовый метод возвращает сам объект. Можно переопределить для преобразования пользовательского объекта.

Устаревшие методы Object.prototype

Устаревшие методы Object.prototype
Метод Описание
__defineGetter__() Устарело Определяет собственное свойство с геттером. Предпочитайте Object.defineProperty().
__defineSetter__() Устарело Определяет собственное свойство с сеттером. Предпочитайте Object.defineProperty().
__lookupGetter__() Устарело Ищет геттер свойства по цепочке прототипов; возвращает функцию или undefined.
__lookupSetter__() Устарело Ищет сеттер свойства по цепочке прототипов; возвращает функцию или undefined.

Свойства Object

Свойства Object
Свойство Описание
Object.prototype Общий прототип обычных объектов; сам не имеет прототипа. У объектов, созданных через Object.create(null), он отсутствует в цепочке.
Object.prototype.constructor Унаследованная ссылка, исходно равная Object. Может быть перекрыта; не является надёжной проверкой типа.
Object.prototype.__proto__ Устаревший геттер/сеттер внутреннего прототипа. Предпочитайте Object.getPrototypeOf() и Object.setPrototypeOf(); это не свойство prototype конструктора.
Object.length Собственное свойство функции-конструктора: число формальных параметров, равное 1.
Object.name Собственное имя функции-конструктора: "Object".

Спецификация

ECMAScript: Object

Примеры, попробуйте сами

Какие ключи видят методы Object

Добавьте неперечислимое или символьное свойство. Сравните keys(), getOwnPropertyNames() и getOwnPropertySymbols().

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="UTF-8" />
    <title>Какие ключи видят методы Object</title>
  </head>
  <body>
    <p>Результат выполнения выводится в консоль.</p>
  </body>
</html>
main.js
JavaScript
const token = Symbol('token')
const obj = Object.create({ inherited: 1 })
obj.visible = 2
obj[token] = 3
Object.defineProperty(obj, 'hidden', { value: 4 })
console.log(Object.keys(obj))
console.log(Object.getOwnPropertyNames(obj))
console.log(Object.getOwnPropertySymbols(obj).map(String))
console.log(Object.hasOwn(obj, 'inherited'))
console.log(Object.hasOwn(obj, token))

Из пар в объект и группы

Измените цены товаров. Сравните объект из пар с группировкой по выбранному признаку.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="UTF-8" />
    <title>Из пар в объект и группы</title>
  </head>
  <body>
    <p>Результат выполнения выводится в консоль.</p>
  </body>
</html>
main.js
JavaScript
const products = [
    { name: 'Чай', price: 100 },
    { name: 'Кофе', price: 300 },
]
console.log(Object.fromEntries(products.map((item) => [item.name, item.price])))
if (typeof Object.groupBy === 'function') {
    const groups = Object.groupBy(products, (item) => (item.price < 200 ? 'cheap' : 'expensive'))
    console.log(groups)
    console.log(Object.getPrototypeOf(groups) === null)
} else {
    console.log('Object.groupBy() не поддерживается в этом браузере')
}

Ограничения объектов и примитивы

Замените число строкой или null. Сравните возвращённое значение и результаты проверок.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="UTF-8" />
    <title>Ограничения объектов и примитивы</title>
  </head>
  <body>
    <p>Результат выполнения выводится в консоль.</p>
  </body>
</html>
main.js
JavaScript
const value = 42
console.log(Object.freeze(value) === value)
console.log(Object.isFrozen(value))
console.log(Object.isSealed(value))
console.log(Object.isExtensible(value))
const obj = Object.freeze({ nested: { value: 1 } })
obj.nested.value = 2
console.log(obj.nested.value)