Sobes.tech
Middle+

Ką žinai apie aprašytojus?

sobes.tech AI

Atsakymas iš AI

JavaScript'e deskriptoriai yra objektai, apibūdinantys įvairias objekto savybes, tokias kaip jos reikšmė (value), rašymo galimybė (writable), perėjimo galimybė (enumerable) ir konfigūravimo galimybė (configurable). Taip pat yra getter ir setter deskriptoriai.

Yra du deskriptorių tipai:

  • Duomenų deskriptoriai: apima savybės reikšmę:

    • value: savybės reikšmė. Gali būti bet koks galiojantis duomenų tipas.
    • writable: loginė reikšmė. Jei true, savybės reikšmė gali būti keičiama (obj.prop = newValue). Jei false, negali būti keičiama.
    • enumerable: loginė reikšmė. Jei true, savybė bus matoma per iteraciją per objekto savybes (pvz., for...in cikle arba naudojant Object.keys()). Paprastai, false — pridedant per Object.defineProperty, ir true — pridedant paprastu priskyrimu.
    • configurable: loginė reikšmė. Jei true, deskriptoriaus savybės gali būti keičiamos ir savybė gali būti ištrinta. Paprastai, false — pridedant per Object.defineProperty (išskyrus value), ir true — pridedant paprastu priskyrimu. Jei nustatyta kaip non-configurable, negali būti keičiama atgal. Galite sumažinti writable nuo true iki false, bet ne atvirkščiai, non-configurable getter/setter.
  • Aksesorių deskriptoriai: apibrėžia funkcijas, kurios bus iškviestos, kai gaunama (getter) arba nustatoma (setter) savybės reikšmė:

    • get: funkcija, iškviečiama, kai skaitoma savybė. Šios funkcijos rezultatas tampa savybės reikšme. Nereikalauja argumentų.
    • set: funkcija, iškviečiama, kai rašoma į savybę. Priima vieną argumentą — naują nustatomą reikšmę.
    • enumerable: loginė reikšmė.
    • configurable: loginė reikšmė.

Deskriptoriai negali būti maišomi: savybė turi būti arba value ir writable, arba get ir set.

Deskriptoriai naudojami valdyti objekto savybes žemesniame lygyje nei įprastas priskyrimas, ypač naudojant Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create() metodus.

Pavyzdys, kaip sukurti savybę su duomenų deskriptoriu:

// Sukuriamas tuščias objektas
const obj = {};

// Apibrėžiame savybę `name` su duomenų deskriptoriu
Object.defineProperty(obj, 'name', {
  value: 'Alice',
  writable: false, // Savybė negali būti keičiama
  enumerable: true, // Savybė bus išvardijama
  configurable: false // Savybės charakteristikos negali būti keičiamos ir savybė negali būti ištrinta
});

console.log(obj.name); // Išves: Alice

// Bandymas pakeisti savybę (bus ignoruojamas arba išmes klaidą)
obj.name = 'Bob';
console.log(obj.name); // Išves: Alice

// Bandymas ištrinti savybę (bus ignoruojamas arba išmes klaidą)
delete obj.name;
console.log(obj.name); // Išves: Alice

Pavyzdys, kaip sukurti savybę su aksesorių deskriptoriu:

// Sukuriamas objektas su privačia kintamąja
const user = {
  _firstName: 'John', // Privatus kintamasis pagal susitarimą
  _lastName: 'Doe'
};

// Apibrėžiame savybę `fullName` su aksesorių deskriptoriu
Object.defineProperty(user, 'fullName', {
  get() {
    // Getter: grąžina pilną vardą
    return `${this._firstName} ${this._lastName}`;
  },
  set(value) {
    // Setter: padalija pilną vardą į dalis ir atnaujina privačius kintamuosius
    const parts = value.split(' ');
    this._firstName = parts[0];
    this._lastName = parts[1];
  },
  enumerable: true, // Bus išvardijama
  configurable: true // Charakteristikos gali būti keičiamos, savybė gali būti ištrinta
});

console.log(user.fullName); // Išves: John Doe

user.fullName = 'Peter Pan';
console.log(user._firstName); // Išves: Peter
console.log(user._lastName); // Išves: Pan
console.log(user.fullName); // Išves: Peter Pan

Deskriptoriai leidžia kurti nekintamas savybes, vėlinio skaičiavimo savybes, prieigos kontrolės savybes (getteriai/setteriai) ir lankstesnį objektų elgesio valdymą.