Ресурсы: 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() - возвращает массив собственных перечисляемых свойств объекта в формате:
Порядок элементов в массиве, который возвращается этим методом, не зависит от того, как объект объявлен.
Если нужен определённый порядок, массив можно отсортировать до вызова метода
Код
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']]
Добавлять комментарии могут только зарегистрированные пользователи.