Sobes.tech
Middle+

Mida sa tead kirjeldajatest?

sobes.tech AI

Vastus AI-lt

JavaScripti deskriptorid on objektid, mis kirjeldavad erinevaid objekti omadusi, nagu selle väärtus (value), kirjutamisvõimalus (writable), loetavus (enumerable) ja konfigureeritavus (configurable). On olemas ka getterite ja setterite deskriptorid.

On kaks tüüpi deskriptorid:

  • Andmete deskriptorid: sisaldavad omaduse väärtust:

    • value: omaduse väärtus. Võib olla ükskõik milline kehtiv andmetüüp.
    • writable: loogiline väärtus. Kui true, saab omaduse väärtust muuta (obj.prop = newValue). Kui false, ei saa.
    • enumerable: loogiline väärtus. Kui true, on omadus nähtav objekti omaduste iteratsioonil (näiteks for...in tsüklis või Object.keys() kasutamisel). Tavaliselt, false — lisamisel Object.defineProperty abil, ja true — lisamisel tavalise omistamisega.
    • configurable: loogiline väärtus. Kui true, saab deskriptorit muuta ja omadust kustutada. Tavaliselt, false — lisamisel Object.defineProperty abil (välja arvatud value), ja true — lisamisel tavalise omistamisega. Kui määratud kui non-configurable, ei saa seda tagasi muuta. Võite vähendada writable väärtust true-lt false-le, kuid mitte vastupidi, non-configurable getteri/setteri puhul.
  • Aksesori deskriptorid: määravad funktsioonid, mis kutsutakse välja, kui omadust loetakse (getter) või määratakse (setter):

    • get: funktsioon, mis kutsutakse välja, kui omadust loetakse. Selle funktsiooni tulemus muutub omaduse väärtuseks. Ei võta argumente.
    • set: funktsioon, mis kutsutakse välja, kui omadusele kirjutatakse. Võtab ühe argumenti — uue väärtuse.
    • enumerable: loogiline väärtus.
    • configurable: loogiline väärtus.

Deskriptorid ei tohi segamini minna: omadusel peab olema kas value ja writable, või get ja set.

Deskriptorid kasutatakse objekti omaduste haldamiseks madalamal tasemel, kui tavaline omistamine, eriti kasutades meetodeid Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().

Näide, kuidas luua omadus andmedeskriptoriga:

// Loome tühja objekti
const obj = {};

// Määrame omaduse `name` andmedeskriptoriga
Object.defineProperty(obj, 'name', {
  value: 'Alice',
  writable: false, // omadust ei saa muuta
  enumerable: true, // omadus on loetav
  configurable: false // omaduse omadusi ei saa muuta ja omadust ei saa kustutada
});

console.log(obj.name); // Väljund: Alice

// Katse muuta omadust (tõenäoliselt ignoreeritakse või visatakse viga)
obj.name = 'Bob';
console.log(obj.name); // Väljund: Alice

// Katse kustutada omadus (tõenäoliselt ignoreeritakse või visatakse viga)
delete obj.name;
console.log(obj.name); // Väljund: Alice

Näide accessor deskriptoriga omaduse loomine:

// Loome objekti privaatsete muutujatega
const user = {
  _firstName: 'John', // privaatne muutuja kokkuleppe järgi
  _lastName: 'Doe'
};

// Määrame omaduse `fullName` accessor deskriptoriga
Object.defineProperty(user, 'fullName', {
  get() {
    // Getter: tagastab täisnime
    return `${this._firstName} ${this._lastName}`;
  },
  set(value) {
    // Setter: jagab täisnime osadeks ja uuendab privaatseid muutujaid
    const parts = value.split(' ');
    this._firstName = parts[0];
    this._lastName = parts[1];
  },
  enumerable: true, // omadus on loetav
  configurable: true // omaduse omadusi saab muuta, omadus saab olla kustutatud
});

console.log(user.fullName); // Väljund: John Doe

user.fullName = 'Peter Pan';
console.log(user._firstName); // Väljund: Peter
console.log(user._lastName); // Väljund: Pan
console.log(user.fullName); // Väljund: Peter Pan

Deskriptorite kasutamine võimaldab luua muutumatuid omadusi, hilinenud arvutamise omadusi, juurdepääsukontrolli omadusi (getterid/setterid) ja paindlikumalt juhtida objektide käitumist.