Co víš o deskriptorech?
sobes.tech AI
Odpověď od AI
Popisovače v JavaScriptu jsou objekty, které popisují různé vlastnosti objektu, jako je její hodnota (value), možnost zápisu (writable), možnost procházení (enumerable) a možnost konfigurace (configurable). Existují také popisovače s gettery a settery.
Existují dva typy popisovačů:
-
Datové popisovače: Obsahují hodnotu vlastnosti.
value: Hodnota vlastnosti. Může být jakýkoli platný datový typ.writable: Logická hodnota. Pokud jetrue, lze hodnotu vlastnosti změnit (obj.prop = newValue). Výchozí hodnota jefalsepro accessorové vlastnosti atruepro datové vlastnosti vytvořené běžným přiřazením.enumerable: Logická hodnota. Pokud jetrue, bude vlastnost viditelná při iteraci přes vlastnosti objektu (například v cyklufor...innebo pomocíObject.keys()). Výchozí jefalsepro vlastnosti přidané pomocíObject.definePropertyatruepro vlastnosti vytvořené běžným přiřazením.configurable: Logická hodnota. Pokud jetrue, lze měnit vlastnosti popisovače (kroměvalueawritable, pokud se mění z dat na accessor) a vlastnost lze odstranit. Výchozí jefalsepro vlastnosti přidané pomocíObject.defineProperty(kroměvalue) atruepro vlastnosti vytvořené běžným přiřazením. Jakmile je nakonfigurováno jako ne-konfigurovatelné, nelze to změnit zpět. Můžete snížitwritableztruenafalse, ale nikoli opačně na ne-konfigurovatelném getteru/setteru.
-
Accessorové popisovače: Definují funkce, které jsou volány při získání (getter) nebo nastavení (setter) hodnoty vlastnosti.
get: Funkce, která je volána při čtení vlastnosti. Výsledek této funkce se stává hodnotou vlastnosti. Nepřijímá argumenty.set: Funkce, která je volána při zápisu do vlastnosti. Přijímá jeden argument — novou nastavovanou hodnotu.enumerable: Logická hodnota (stejně jako u datových popisovačů).configurable: Logická hodnota (stejně jako u datových popisovačů).
Popisovače nelze míchat: vlastnost má buď value a writable, nebo get a set.
Popisovače se používají ke správě vlastností objektu na nižší úrovni než běžné přiřazení, zejména prostřednictvím metod Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().
Příklad vytvoření vlastnosti s datovým popisovačem:
// Vytvoříme prázdný objekt
const obj = {};
// Definujeme vlastnost 'name' s datovým popisovačem
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: false, // Vlastnost nelze změnit
enumerable: true, // Vlastnost bude enumerovatelná
configurable: false // Charakteristiky vlastnosti nelze změnit, vlastnost nelze odstranit
});
console.log(obj.name); // Vypíše: Alice
// Pokus o změnu vlastnosti (bude ignorováno v přísném režimu nebo vyvolá chybu)
obj.name = 'Bob';
console.log(obj.name); // Vypíše: Alice
// Pokus o odstranění vlastnosti (bude ignorováno nebo vyvolá chybu)
delete obj.name;
console.log(obj.name); // Vypíše: Alice
Příklad vytvoření vlastnosti s accessorovým popisovačem:
// Vytvoříme objekt s privátní proměnnou
const user = {
_firstName: 'John', // Konvenční privátní proměnná
_lastName: 'Doe'
};
// Definujeme vlastnost 'fullName' s accessorovým popisovačem
Object.defineProperty(user, 'fullName', {
get() {
// Getter: vrací úplné jméno
return `${this._firstName} ${this._lastName}`;
},
set(value) {
// Setter: rozděluje úplné jméno na části a aktualizuje privátní proměnné
const parts = value.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
},
enumerable: true, // Vlastnost bude enumerovatelná
configurable: true // Charakteristiky vlastnosti lze měnit, vlastnost lze odstranit
});
console.log(user.fullName); // Vypíše: John Doe
user.fullName = 'Peter Pan';
console.log(user._firstName); // Vypíše: Peter
console.log(user._lastName); // Vypíše: Pan
console.log(user.fullName); // Vypíše: Peter Pan
Použití popisovačů umožňuje vytvářet neměnné vlastnosti, vlastnosti s líným výpočtem, vlastnosti s kontrolou přístupu (gettery/settery) a flexibilnější správu chování objektů.