hellojs.ru
Главная - Дополнительные основы JavaScript - Дескрипторы свойств и полезные методы объектов

Дескрипторы свойств и полезные методы объектов

Размещено в категории "Дополнительные основы JavaScript"
06.10.2024 / просмотров: 47 / комментариев: 0
Ресурсы:

Object.keys()
Object.values()
Object.entries()




Специальные атрибуты свойств (флаги):

writable - если true - свойство можно изменять, если false - только для чтения

enumerable - если true - свойство перечисляется в циклах, если false - цикл его игнорирует

configurable - если true - свойство можно удалять, а атрибуты менять, если false - этого сделать нельзя.

По умолчанию для создаваемых свойств все три флага установлены в true.

Вывод флагов в консоль:

Код

console.log(Object.getOwnPropertyDescriptor(user, 'name'));

здесь user - объект, который интересует

name - свойство объекта, для которого нужно вывести флаги

Метод Object.defineProperty() позволяет изменять состояния флагов.

Этот метод определяет новое или изменяет существующее свойство непосредственно на объекте, возвращая этот объект.

Пример:

Код

Object.defineProperty(user, 'name', {writable: false});

Теперь свойство name будет только для чтения, редактировать его не получится.

При помощи Object.defineProperty() можно создавать новое свойство, которого еще нет в объекте, причем сразу задавать ему параметры флагов.

Цитата

Warning: Если при этом параметры флагов не указывать, они автоматически выставятся в false

Пример:

Код

Object.defineProperty(user, 'gender', {value: 'male'});

здесь:

user - используемый объект

gender - создаваемое новое свойство

male - значение этого свойства

Флаги для этого свойства автоматически будут выставлены в false

Новые свойства можно создавать и динамически, например, с помощью данных, полученных от пользователя:

Код

Object.defineProperty(user, 'birthday',
{
  value: prompt('Ваша дата рождения?'),
  enumerable: true,
  configurable: true
});

У нас добавится в объект новое свойство birthday, причём, после того, как пользователь укажет дату своего рождения в диалоговом окне, редактировать затем он её уже не сможет, так как для свойства по умолчанию для флага writable установится значение false

Пример №2

При переборе for...in выводятся не только свойства, но и методы объекта.

Как этого избежать?

Установить им нужный флаг:

Код

Object.defineProperty(user, 'showMyDB', {enumerable: false});

Теперь при переборе метод showMyDB выводиться не будет.

Чтобы создать свойство, которое после создания нельзя будет удалить и изменять его атрибуты, достаточно для его флага configurable установить значение false

Редактировать сразу несколько свойств можно таким образом:

Код

Object.defineProperties(user, {
  name: { writable: false },
  surname: { writable: false }
});  


Полезные методы объектов



Object.preventExtensions() - предотвращает добавление новых свойств к объекту (то есть предотвращает его расширение в будущем)

Object.seal() - запечатывает объект, предотвращая добавление новых свойств к объекту и делая все уже существующие свойства не настраиваемыми. Значения свойств при этом изменяемы.

Object.freeze() - замораживает объект, это значит предотвращает добавление новых свойств к объекту, удаление уже имеющихся свойств и их изменение, а также значений их атрибутов перечисляемости, настраиваемости и записываемости. Объект становится эффективно неизменным. Метод возвращает замороженный объект.

Object.isExtensible() - определяет, является ли объект расширяемым (то есть, можно ли к нему добавлять новые свойства)

Object.keys() - возвращает массив из собственных перечисляемых (то есть, у которых значение true для флага enumerable) свойств переданного объекта, в том же порядке, в котором они бы обходились циклом for...in

Метод возвращает массив строковых элементов, соответствующих именам перечисляемых свойств.

Пример:

Код

let obj = {0: 'a', 1: 'b', 2: 'c'};
let arr = ['a','b','c'];

console.log(Object.keys(obj));
console.log(Object.keys(arr));

Результат в консоли:

Цитата

['0','1','2']
['0','1','2']

Object.values() - возвращает массив значений перечисляемых свойств объекта, в том же порядке, что и цикл for...in

Код

const obj = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.values(obj));

Результат в консоли:

Цитата

['somestring', 42, false]

Object.entries() - возвращает массив собственных перечисляемых свойств объекта в формате:

Код

[key, value]

Порядок элементов в массиве, который возвращается этим методом, не зависит от того, как объект объявлен.

Если нужен определённый порядок, массив можно отсортировать до вызова метода

Код

Object.entries(obj).sort((a, b) => a[0] - b[0]);

Пример работы метода:

Код

let obj = {0: 'a', 1: 'b', 2: 'c'};

console.log(Object.entries(obj));

В консоли будет массив, элементами которого будут также массивы, каждый из которых содержит свойство и его значение в качестве элементов:

Цитата

[['0', 'a'],['1', 'b'],['2', 'c']]
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
Сайт управляется системой uCoz