Читаем и меняем свойства объектов на уровне JavaScript-движка!
Многие знают, что объект хранит ключи и значения:
const user = {
name: 'Alex'
};
Но каждое свойство объекта на самом деле имеет скрытые настройки: можно ли его менять, удалять, показывать в циклах и т.д.
Посмотреть эти параметры можно через:
Object.getOwnPropertyDescriptor(user, 'name');
Результат:
{
value: 'Alex',
writable: true,
enumerable: true,
configurable: true
}
Например, можно сделать свойство только для чтения:
Object.defineProperty(user, 'id', {
value: 123,
writable: false
});
Теперь изменить его нельзя:
user.id = 456;
console.log(user.id);
// 123
Эти же механизмы используют внутри себя библиотеки, фреймворки и сам JavaScript для создания getter/setter и скрытых свойств.
Object.defineProperty(user, 'fullName', {
get() {
return `${this.name} Smith`;
}
});
Теперь:
user.fullName;
// Alex Smith
🔥 Object.defineProperty() и дескрипторы позволяют управлять поведением объектов, а не просто хранить данные.
📣 JS Ready | #совет
Многие знают, что объект хранит ключи и значения:
const user = {
name: 'Alex'
};
Но каждое свойство объекта на самом деле имеет скрытые настройки: можно ли его менять, удалять, показывать в циклах и т.д.
Посмотреть эти параметры можно через:
Object.getOwnPropertyDescriptor(user, 'name');
Результат:
{
value: 'Alex',
writable: true,
enumerable: true,
configurable: true
}
Например, можно сделать свойство только для чтения:
Object.defineProperty(user, 'id', {
value: 123,
writable: false
});
Теперь изменить его нельзя:
user.id = 456;
console.log(user.id);
// 123
Эти же механизмы используют внутри себя библиотеки, фреймворки и сам JavaScript для создания getter/setter и скрытых свойств.
Object.defineProperty(user, 'fullName', {
get() {
return `${this.name} Smith`;
}
});
Теперь:
user.fullName;
// Alex Smith
🔥 Object.defineProperty() и дескрипторы позволяют управлять поведением объектов, а не просто хранить данные.
📣 JS Ready | #совет