Sobes.tech
Middle+

Čo vieš o deskriptoroch?

sobes.tech AI

Odpoveď od AI

Dizajnéry v JavaScripte sú objekty, ktoré opisujú rôzne vlastnosti vlastnosti objektu, ako je jej hodnota (value), možnosť zápisu (writable), možnosť prechádzania (enumerable) a možnosť konfigurácie (configurable). Existujú tiež dizajnéry s gettermi a settermi.

Existujú dva typy dizajnérov:

  • Dizajnéry dát: Obsahujú hodnotu vlastnosti.

    • value: Hodnota vlastnosti. Môže byť akéhokoľvek platného dátového typu.
    • writable: Logická hodnota. Ak je true, hodnotu vlastnosti je možné zmeniť (obj.prop = newValue). Predvolene je false pre accessor vlastnosti a true pre dátové vlastnosti vytvorené bežným priradením.
    • enumerable: Logická hodnota. Ak je true, vlastnosť bude viditeľná pri iterácii vlastností objektu (napríklad v cykle for...in alebo pri použití Object.keys()). Predvolene je false pre vlastnosti pridané pomocou Object.defineProperty a true pre vlastnosti vytvorené bežným priradením.
    • configurable: Logická hodnota. Ak je true, vlastnosti dizajnéra (okrem value a writable pri ich zmene z dátových na accessor) je možné meniť a vlastnosť odstrániť. Predvolene je false pre vlastnosti pridané pomocou Object.defineProperty (okrem value) a true pre vlastnosti vytvorené bežným priradením. Ak je vlastnosť nastavená ako non-configurable, nemôže byť zmenená späť. Môžete znížiť writability z true na false, ale nie opačne na non-configurable getter/setter.
  • Dizajnéry accessorov: Určujú funkcie, ktoré budú volané pri získavaní (getter) alebo nastavovaní (setter) hodnoty vlastnosti.

    • get: Funkcia, ktorá sa volá pri čítaní vlastnosti. Výsledok tejto funkcie sa stáva hodnotou vlastnosti. Neprijíma argumenty.
    • set: Funkcia, ktorá sa volá pri zápise do vlastnosti. Prijíma jeden argument — novú nastavovanú hodnotu.
    • enumerable: Logická hodnota (rovnako ako dátové dizajnéry).
    • configurable: Logická hodnota (rovnako ako dátové dizajnéry).

Dizajnéry nemožno miešať: vlastnosti má buď value a writable, alebo get a set.

Dizajnéry sa používajú na riadenie vlastností objektu na nižšej úrovni, než je bežné priradenie, najmä pomocou metód Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().

Príklad vytvorenia vlastnosti s dátovým dizajnérom:

// Vytvárame prázdny objekt
const obj = {};

// Definujeme vlastnosť 'name' s dátovým dizajnérom
Object.defineProperty(obj, 'name', {
  value: 'Alice',
  writable: false, // Vlastnosť nemožno zmeniť
  enumerable: true, // Vlastnosť bude prehľadávaná
  configurable: false // Charakteristiky vlastnosti nemožno zmeniť, vlastnosť nemožno odstrániť
});

console.log(obj.name); // Vypíše: Alice

// Pokus o zmenu vlastnosti (bude ignorovaný v režime prísneho režimu alebo vyhodí chybu)
obj.name = 'Bob';
console.log(obj.name); // Vypíše: Alice

// Pokus o odstránenie vlastnosti (bude ignorovaný alebo vyhodí chybu)
delete obj.name;
console.log(obj.name); // Vypíše: Alice

Príklad vytvorenia vlastnosti s accessor dizajnérom:

// Vytvárame objekt s privátnou premennou
const user = {
  _firstName: 'John', // Privátná premenná podľa dohody
  _lastName: 'Doe'
};

// Definujeme vlastnosť 'fullName' s accessor dizajnérom
Object.defineProperty(user, 'fullName', {
  get() {
    // Getter: vracia úplné meno
    return `${this._firstName} ${this._lastName}`;
  },
  set(value) {
    // Setter: rozdeľuje úplné meno na časti a aktualizuje privátne premenné
    const parts = value.split(' ');
    this._firstName = parts[0];
    this._lastName = parts[1];
  },
  enumerable: true, // Vlastnosť bude prehľadávaná
  configurable: true // Charakteristiky vlastnosti je možné zmeniť, vlastnosť je možné odstrániť
});

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žitie dizajnérov umožňuje vytvárať nezmeniteľné vlastnosti, vlastnosti s oneskoreným výpočtom, vlastnosti s kontrolou prístupu (gettermi/settermi) a flexibilnejšie riadiť správanie objektov.