Č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 jetrue, hodnotu vlastnosti je možné zmeniť (obj.prop = newValue). Predvolene jefalsepre accessor vlastnosti atruepre dátové vlastnosti vytvorené bežným priradením.enumerable: Logická hodnota. Ak jetrue, vlastnosť bude viditeľná pri iterácii vlastností objektu (napríklad v cyklefor...inalebo pri použitíObject.keys()). Predvolene jefalsepre vlastnosti pridané pomocouObject.definePropertyatruepre vlastnosti vytvorené bežným priradením.configurable: Logická hodnota. Ak jetrue, vlastnosti dizajnéra (okremvalueawritablepri ich zmene z dátových na accessor) je možné meniť a vlastnosť odstrániť. Predvolene jefalsepre vlastnosti pridané pomocouObject.defineProperty(okremvalue) atruepre 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.