Mit tudsz a leírókról?
sobes.tech MI
Válasz az MI-től
A JavaScript-ben a leírók olyan objektumok, amelyek különböző tulajdonságokat írnak le egy objektumról, például az értékét (value), írhatóságát (writable), enumerálhatóságát (enumerable) és konfigurálhatóságát (configurable). Vannak getter- és setter-hez tartozó leírók is.
Két típus létezik:
-
Adatleírók: tartalmazzák a tulajdonság értékét.
value: A tulajdonság értéke. Bármilyen érvényes adat típus lehet.writable: Logikai érték. Hatrue, a tulajdonság értéke módosítható (obj.prop = newValue). Alapértelmezettfalseaz accessor tulajdonságoknál éstrueaz adat tulajdonságoknál, amelyeket egyszerű hozzárendeléssel hoztak létre.enumerable: Logikai érték. Hatrue, a tulajdonság látható lesz az objektum tulajdonságainak iterálásakor (példáulfor...inciklusban vagyObject.keys()-szel). AlapértelmezettfalseazObject.defineProperty-val hozzáadott tulajdonságoknál, éstrueaz egyszerű hozzárendeléssel létrehozottaknál.configurable: Logikai érték. Hatrue, a leíró jellemzői (kivéve avalueéswritable, ha azok adatokról accessorokra váltanak) módosíthatók, és a tulajdonság törölhető. AlapértelmezettfalseazObject.defineProperty-val hozzáadott tulajdonságoknál (kivéve avalue), éstrueaz egyszerű hozzárendeléssel létrehozottaknál. Egyszer konfigurálva nem változtatható vissza. Csökkentheted awritableértékéttrue-rőlfalse-ra, de nem fordítva nem módosítható nem-konfigurálható getter/setter esetén.
-
Accessor leírók: Olyan függvényeket határoznak meg, amelyek akkor hívódnak meg, amikor a tulajdonság értékét olvassák (getter) vagy írják (setter).
get: Függvény, amely akkor hívódik meg, amikor a tulajdonság értékét olvassák. Ennek a függvénynek nincs argumentuma, és az eredménye lesz a tulajdonság értéke. Nem fogad argumentumokat.set: Függvény, amely akkor hívódik meg, amikor a tulajdonság értékét írják. Egy argumentumot fogad — az új értéket.enumerable: Logikai érték (hasonló az adatleírókhoz).configurable: Logikai érték (hasonló az adatleírókhoz).
A leírókat nem lehet keverni: egy tulajdonságnak vagy value és writable-ja van, vagy get és set.
A leírókat az objektum tulajdonságainak alacsonyabb szintű kezelésére használják, például a Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create() metódusokon keresztül.
Példa egy adatleíróval rendelkező tulajdonság létrehozására:
// Egy üres objektum létrehozása
const obj = {};
// A `name` tulajdonság meghatározása adatleíróval
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: false, // A tulajdonság nem módosítható
enumerable: true, // A tulajdonság listázható lesz
configurable: false // A tulajdonság jellemzői nem módosíthatók, a tulajdonság nem törölhető
});
console.log(obj.name); // Kiírja: Alice
// A tulajdonság módosítására tett kísérlet (szigorú módban hibát dob vagy ignorál)
obj.name = 'Bob';
console.log(obj.name); // Kiírja: Alice
// A tulajdonság törlésére tett kísérlet (nem fog sikerülni vagy hibát dob)
delete obj.name;
console.log(obj.name); // Kiírja: Alice
Példa egy accessor típusú tulajdonság létrehozására:
// Egy objektum privát változókkal
const user = {
_firstName: 'John', // Konvenció szerint privát változó
_lastName: 'Doe'
};
// A `fullName` tulajdonság meghatározása accessorral
Object.defineProperty(user, 'fullName', {
get() {
// Getter: visszaadja a teljes nevet
return `${this._firstName} ${this._lastName}`;
},
set(value) {
// Setter: felbontja a teljes nevet részekre és frissíti a privát változókat
const parts = value.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
},
enumerable: true, // A tulajdonság listázható lesz
configurable: true // A tulajdonság jellemzői módosíthatók, a tulajdonság törölhető
});
console.log(user.fullName); // Kiírja: John Doe
user.fullName = 'Peter Pan';
console.log(user._firstName); // Kiírja: Peter
console.log(user._lastName); // Kiírja: Pan
console.log(user.fullName); // Kiírja: Peter Pan
A leírók használatával létrehozhatók változatlan tulajdonságok, késleltetett értékelésű tulajdonságok, hozzáférés-ellenőrzött tulajdonságok (getter/setter) és rugalmasabb objektum viselkedés kezelése.