Дар бораи тасвиркунандагон чӣ медонӣ?
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-и) и по-гъвкаво управление на поведението на обектите.