Sobes.tech
Middle+

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. Ha true, a tulajdonság értéke módosítható (obj.prop = newValue). Alapértelmezett false az accessor tulajdonságoknál és true az adat tulajdonságoknál, amelyeket egyszerű hozzárendeléssel hoztak létre.
    • enumerable: Logikai érték. Ha true, a tulajdonság látható lesz az objektum tulajdonságainak iterálásakor (például for...in ciklusban vagy Object.keys()-szel). Alapértelmezett false az Object.defineProperty-val hozzáadott tulajdonságoknál, és true az egyszerű hozzárendeléssel létrehozottaknál.
    • configurable: Logikai érték. Ha true, a leíró jellemzői (kivéve a value és writable, ha azok adatokról accessorokra váltanak) módosíthatók, és a tulajdonság törölhető. Alapértelmezett false az Object.defineProperty-val hozzáadott tulajdonságoknál (kivéve a value), és true az egyszerű hozzárendeléssel létrehozottaknál. Egyszer konfigurálva nem változtatható vissza. Csökkentheted a writable értékét true-ről false-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.