Sobes.tech
Middle+

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 je true, lze hodnotu vlastnosti změnit (obj.prop = newValue). Výchozí hodnota je false pro accessorové vlastnosti a true pro datové vlastnosti vytvořené běžným přiřazením.
    • enumerable: Logická hodnota. Pokud je true, bude vlastnost viditelná při iteraci přes vlastnosti objektu (například v cyklu for...in nebo pomocí Object.keys()). Výchozí je false pro vlastnosti přidané pomocí Object.defineProperty a true pro vlastnosti vytvořené běžným přiřazením.
    • configurable: Logická hodnota. Pokud je true, lze měnit vlastnosti popisovače (kromě value a writable, pokud se mění z dat na accessor) a vlastnost lze odstranit. Výchozí je false pro vlastnosti přidané pomocí Object.defineProperty (kromě value) a true pro 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ížit writable z true na false, 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ů.