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. Alstrue, kan de waarde worden gewijzigd (obj.prop = newValue). Standaardfalsevoor accessor-eigenschappen entruevoor data-eigenschappen die gewoon worden toegewezen.enumerable: Een boolean. Alstrue, is de eigenschap zichtbaar bij iteratie over de eigenschappen van het object (bijvoorbeeld in eenfor...in-lus of metObject.keys()). Standaardfalsevoor eigenschappen toegevoegd metObject.defineProperty, entruevoor eigenschappen die gewoon worden toegewezen.configurable: Een boolean. Alstrue, kunnen de kenmerken van de omschrijving (behalvevalueenwritablebij wijziging van data naar accessoren) worden gewijzigd en kan de eigenschap worden verwijderd. Standaardfalsevoor eigenschappen toegevoegd metObject.defineProperty(behalvevalue), entruevoor 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.