JavaScript объекты
Создание объекта
Обычно объект создают литералом {}. Object(value) возвращает переданный объект без
копирования, оборачивает примитив, а для null и undefined создаёт пустой объект. Свойства
имеют строковые или символьные ключи. Методы прототипа могут быть перекрыты собственными свойствами.
Ниже отдельно перечислены собственные статические методы 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
| Метод | Описание |
|---|---|
hasOwnProperty()
|
Метод возвращает логическое значение, которое указывает на то содержит ли объект указанное собственное (неунаследованное) свойство, или метод. |
isPrototypeOf()
|
Проверяет существует ли указанный объект в цепочке прототипов другого объекта, возвращая при этом логическое значение. |
propertyIsEnumerable()
|
Возвращает логическое значение, которое определяет является ли указанное свойство или метод целевого объекта перечислимым. |
toLocaleString()
|
Вызывает this.toString(). Локализацию для конкретного типа обеспечивают его переопределения.
|
toString()
|
Метод возвращает строковое представление указанного объекта. |
valueOf()
|
Базовый метод возвращает сам объект. Можно переопределить для преобразования пользовательского объекта. |
Устаревшие методы Object.prototype
| Метод | Описание |
|---|---|
__defineGetter__() Устарело |
Определяет собственное свойство с геттером. Предпочитайте Object.defineProperty(). |
__defineSetter__() Устарело |
Определяет собственное свойство с сеттером. Предпочитайте Object.defineProperty(). |
__lookupGetter__() Устарело |
Ищет геттер свойства по цепочке прототипов; возвращает функцию или undefined. |
__lookupSetter__() Устарело |
Ищет сеттер свойства по цепочке прототипов; возвращает функцию или undefined. |
Свойства Object
| Свойство | Описание |
|---|---|
Object.prototype |
Общий прототип обычных объектов; сам не имеет прототипа. У объектов, созданных через
Object.create(null), он отсутствует в цепочке.
|
Object.prototype.constructor |
Унаследованная ссылка, исходно равная Object. Может быть перекрыта; не является надёжной
проверкой типа.
|
Object.prototype.__proto__ |
Устаревший геттер/сеттер внутреннего прототипа. Предпочитайте Object.getPrototypeOf() и
Object.setPrototypeOf(); это не свойство prototype конструктора.
|
Object.length |
Собственное свойство функции-конструктора: число формальных параметров, равное 1. |
Object.name |
Собственное имя функции-конструктора: "Object". |
Спецификация
Примеры, попробуйте сами
Какие ключи видят методы Object
Добавьте неперечислимое или символьное свойство. Сравните keys(), getOwnPropertyNames() и getOwnPropertySymbols().
index.html
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
<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
<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)
Режим чтения