Sobes.tech
Middle+

Wat weet je over descriptors?

sobes.tech AI

Antwoord van AI

JavaScript-omschrijvingen zijn objecten die verschillende eigenschappen van een object beschrijven, zoals de waarde (value), schrijfbaarheid (writable), doorvoerbaarheid (enumerable) en configureerbaarheid (configurable). Er zijn ook omschrijvingen met getters en setters.

Er zijn twee soorten omschrijvingen:

  • Data-omschrijvingen: Bevatten de waarde van de eigenschap.

    • value: De waarde van de eigenschap. Kan elk geldig datatype zijn.
    • writable: Een boolean. Als true, kan de waarde worden gewijzigd (obj.prop = newValue). Standaard false voor accessor-eigenschappen en true voor data-eigenschappen die gewoon worden toegewezen.
    • enumerable: Een boolean. Als true, is de eigenschap zichtbaar bij iteratie over de eigenschappen van het object (bijvoorbeeld in een for...in-lus of met Object.keys()). Standaard false voor eigenschappen toegevoegd met Object.defineProperty, en true voor eigenschappen die gewoon worden toegewezen.
    • configurable: Een boolean. Als true, kunnen de kenmerken van de omschrijving (behalve value en writable bij wijziging van data naar accessoren) worden gewijzigd en kan de eigenschap worden verwijderd. Standaard false voor eigenschappen toegevoegd met Object.defineProperty (behalve value), en true voor eigenschappen die gewoon worden toegewezen. Eenmaal geconfigureerd als niet-configureerbaar, kan dit niet meer worden gewijzigd. Je kunt de writability verlagen van true naar false, maar niet andersom op een niet-configureerbare getter/setter.
  • Accessor-omschrijvingen: Definiëren functies die worden aangeroepen bij het verkrijgen (getter) of instellen (setter) van de waarde van een eigenschap.

    • get: Functie die wordt aangeroepen bij het lezen van de eigenschap. Het resultaat van deze functie wordt de waarde van de eigenschap. Neemt geen argumenten.
    • set: Functie die wordt aangeroepen bij het schrijven naar de eigenschap. Neemt één argument — de nieuwe waarde.
    • enumerable: Een boolean (zoals bij data-omschrijvingen).
    • configurable: Een boolean (zoals bij data-omschrijvingen).

Overschrijvingen kunnen niet worden gemengd: een eigenschap heeft of value en writable, of get en set.

Omschrijvingen worden gebruikt om eigenschappen van een object op een lager niveau te beheren dan gewone toewijzing, met name via methoden zoals Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().

Voorbeeld van het maken van een eigenschap met een data-omschrijving:

// Maak een leeg object
const obj = {};

// Definieer de eigenschap 'name' met een data-omschrijving
Object.defineProperty(obj, 'name', {
  value: 'Alice',
  writable: false, // Eigenschap kan niet worden gewijzigd
  enumerable: true, // Eigenschap is doorvoerbaar
  configurable: false // Kenmerken van de eigenschap kunnen niet worden gewijzigd, eigenschap kan niet worden verwijderd
});

console.log(obj.name); // Output: Alice

// Poging om de eigenschap te wijzigen (wordt genegeerd in strikte modus of geeft een fout)
obj.name = 'Bob';
console.log(obj.name); // Output: Alice

// Poging om de eigenschap te verwijderen (wordt genegeerd of geeft een fout)
delete obj.name;
console.log(obj.name); // Output: Alice

Voorbeeld van het maken van een eigenschap met een accessoren-omschrijving:

// Maak een object met een private variabele
const user = {
  _firstName: 'John', // Conventioneel privé
  _lastName: 'Doe'
};

// Definieer de eigenschap 'fullName' met een accessor-omschrijving
Object.defineProperty(user, 'fullName', {
  get() {
    // Getter: retourneert de volledige naam
    return `${this._firstName} ${this._lastName}`;
  },
  set(value) {
    // Setter: splitst de volledige naam en update de private variabelen
    const parts = value.split(' ');
    this._firstName = parts[0];
    this._lastName = parts[1];
  },
  enumerable: true, // Eigenschap is doorvoerbaar
  configurable: true // Kenmerken van de eigenschap kunnen worden gewijzigd, eigenschap kan worden verwijderd
});

console.log(user.fullName); // Output: John Doe

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

Het gebruik van omschrijvingen maakt het mogelijk om onveranderlijke eigenschappen, eigenschappen met lazy evaluatie, toegangsbeschermde eigenschappen (getters/setters) en meer flexibele objectgedragingen te creëren.