Sobes.tech
Middle+

Š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

Користећи дескрипторе можете креирати имутабилна својства, својства са ленивим израчуном, својства са контролом приступа (геттери/сеттери) и флексибилније управљати понашањем објеката.