Sobes.tech
Middle+

Дар бораи тасвиркунандагон чӣ медонӣ?

sobes.tech AI

Ҷавоб аз AI

Дескрипторите в 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 за свойства, създадени с обикновено присвояване. След като е конфигурирано като non-configurable, не може да бъде променяно обратно. Можете да намалите writability от true на false, но не и обратно за non-configurable getter/setter.
  • Дескриптори за аксесори: определят функции, които ще бъдат извикани при получаване (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

Използването на дескриптори позволява създаването на неизменяеми свойства, свойства с лениво изчисление, свойства с контрол на достъпа (getter-и/setter-и) и по-гъвкаво управление на поведението на обектите.