Šta znaš o deskriptorima?
sobes.tech АИ
Одговор од АИ
Дескриптори у JavaScript-у су објекти који описују различита својства објекта, као што су његова вредност (value), могућност уписа (writable), могућност понављања (enumerable) и могућност конфигурације (configurable). Такође постоје дескриптори са геттерима и сеттерима.
Постоје две врсте дескриптора:
-
Датски дескриптори: садрже вредност својства.
value: Вредност својства. Може бити било који валидан тип података.writable: Логичка вредност. Ако јеtrue, вредност својства може се променити (obj.prop = newValue). Стандардноfalseза accessor својства иtrueза датска својства која се креирају обичним доделом.enumerable: Логичка вредност. Ако јеtrue, својство ће бити видљиво током итерације преко својстава објекта (нпр. уfor...inили помоћуObject.keys()). Стандардноfalseза својства додата помоћуObject.defineProperty, иtrueза она која су креирана обичним доделом.configurable: Логичка вредност. Ако јеtrue, карактеристике дескриптора (осимvalueиwritableкада се мењају из датских у accessor) могу се мењати, а својство може бити избрисано. Стандардноfalseза својства додата помоћуObject.defineProperty(осимvalue), иtrueза она која су креирана обичним доделом. Једном конфигурисано као не-конфигурибилно, не може се променити назад. Можете смањитиwritableсаtrueнаfalse, али не и обрнуто на не-конфигурибилни геттер/сеттер.
-
Accessor дескриптори: Одређују функције које ће бити позване приликом добијања (getter) или постављања (setter) вредности својства.
get: Функција која се позива приликом читања својства. Резултат ове функције постаје вредност својства. Не прихвата аргументе.set: Функција која се позива приликом уписа у својство. Прихвата један аргумент — нову вредност.enumerable: Логичка вредност (слично датским дескрипторима).configurable: Логичка вредност (слично датским дескрипторима).
Дескриптори се не могу мешати: својство или има value и writable, или get и set.
Дескриптори се користе за управљање својствима објекта на нижем нивоу од обичног додељивања, посебно преко метода као што су Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().
Пример креирања својства са датским дескриптором:
// Креирамо празан објекат
const obj = {};
// Дефинишемо својство 'name' са датским дескриптором
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: false, // Свойство не може бити измењено
enumerable: true, // Свойство ће бити избројиво
configurable: false // Карактеристике својства не могу се мењати, својство не може бити избрисано
});
console.log(obj.name); // Исписује: Alice
// Покушај промене својства (биће игнорисан у строгом режиму или ће изазвати грешку)
obj.name = 'Bob';
console.log(obj.name); // Исписује: Alice
// Покушај брисања својства (биће игнорисан или ће изазвати грешку)
delete obj.name;
console.log(obj.name); // Исписује: Alice
Пример креирања својства са accessor дескриптором:
// Креирамо објекат са приватном променљивом
const user = {
_firstName: 'John', // Конвенционално приватна променљива
_lastName: 'Doe'
};
// Дефинишемо својство 'fullName' са accessor дескриптором
Object.defineProperty(user, 'fullName', {
get() {
// Геттер: враћа пуно име
return `${this._firstName} ${this._lastName}`;
},
set(value) {
// Сеттер: дели пуно име на делове и ажурира приватне променљиве
const parts = value.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
},
enumerable: true, // Свойство ће бити избројиво
configurable: true // Карактеристике својства могу се мењати, својство може бити избрисано
});
console.log(user.fullName); // Исписује: John Doe
user.fullName = 'Peter Pan';
console.log(user._firstName); // Исписује: Peter
console.log(user._lastName); // Исписује: Pan
console.log(user.fullName); // Исписује: Peter Pan
Користећи дескрипторе можете креирати имутабилна својства, својства са ленивим израчуном, својства са контролом приступа (геттери/сеттери) и флексибилније управљати понашањем објеката.