Que savez-vous des descripteurs?
sobes.tech IA
Réponse de l'IA
Les descripteurs en JavaScript sont des objets qui décrivent diverses propriétés d'une propriété d'un objet, telles que sa valeur (value), la possibilité d'écriture (writable), la possibilité d'énumération (enumerable) et la possibilité de configuration (configurable). Il existe également des descripteurs avec des getters et setters.
Il existe deux types de descripteurs :
-
Descripteurs de données : Contiennent la valeur de la propriété.
value: La valeur de la propriété. Peut être de n'importe quel type de donnée valide.writable: Un booléen. Sitrue, la valeur de la propriété peut être modifiée (obj.prop = newValue). Par défaut,falsepour les propriétés d'accès ettruepour les propriétés de données créées par assignation normale.enumerable: Un booléen. Sitrue, la propriété sera visible lors de l'itération sur les propriétés de l'objet (par exemple, dans une bouclefor...inou en utilisantObject.keys()). Par défaut,falsepour les propriétés ajoutées avecObject.definePropertyettruepour celles créées par assignation normale.configurable: Un booléen. Sitrue, les caractéristiques du descripteur (saufvalueetwritablelorsqu'ils changent de données à accessoires) peuvent être modifiées, et la propriété peut être supprimée. Par défaut,falsepour les propriétés ajoutées avecObject.defineProperty(saufvalue) ettruepour celles créées par assignation normale. Une fois configuré comme non configurable, il ne peut plus être modifié. Vous pouvez diminuer la writable de true à false, mais pas l'inverse sur un getter/setter non configurable.
-
Descripteurs d'accessoires : Définissent des fonctions qui seront appelées lors de la lecture (getter) ou de l'écriture (setter) de la valeur de la propriété.
get: Fonction appelée lors de la lecture de la propriété. Le résultat de cette fonction devient la valeur de la propriété. N'accepte pas d'arguments.set: Fonction appelée lors de l'écriture dans la propriété. Accepte un argument, qui est la nouvelle valeur à définir.enumerable: Un booléen (similaire aux descripteurs de données).configurable: Un booléen (similaire aux descripteurs de données).
Il ne faut pas mélanger les descripteurs : une propriété a soit value et writable, soit get et set.
Les descripteurs sont utilisés pour gérer les propriétés d'un objet à un niveau plus bas que l'assignation normale, notamment via les méthodes Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().
Exemple de création d'une propriété avec un descripteur de données :
// Création d'un objet vide
const obj = {};
// Définition de la propriété 'name' avec un descripteur de données
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: false, // La propriété ne peut pas être modifiée
enumerable: true, // La propriété sera énumérable
configurable: false // Les caractéristiques de la propriété ne peuvent pas être modifiées, la propriété ne peut pas être supprimée
});
console.log(obj.name); // Affichera : Alice
// Tentative de modification de la propriété (sera ignorée en mode strict ou lancera une erreur)
obj.name = 'Bob';
console.log(obj.name); // Affichera : Alice
// Tentative de suppression de la propriété (sera ignorée ou lancera une erreur)
delete obj.name;
console.log(obj.name); // Affichera : Alice
Exemple de création d'une propriété avec un descripteur d'accessoires :
// Création d'un objet avec une variable privée
const user = {
_firstName: 'John', // Variable privée par convention
_lastName: 'Doe'
};
// Définition de la propriété 'fullName' avec un descripteur d'accessoires
Object.defineProperty(user, 'fullName', {
get() {
// Getter : retourne le nom complet
return `${this._firstName} ${this._lastName}`;
},
set(value) {
// Setter : divise le nom complet en parties et met à jour les variables privées
const parts = value.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
},
enumerable: true, // La propriété sera énumérable
configurable: true // Les caractéristiques de la propriété peuvent être modifiées, la propriété peut être supprimée
});
console.log(user.fullName); // Affichera : John Doe
user.fullName = 'Peter Pan';
console.log(user._firstName); // Affichera : Peter
console.log(user._lastName); // Affichera : Pan
console.log(user.fullName); // Affichera : Peter Pan
L'utilisation de descripteurs permet de créer des propriétés immuables, des propriétés avec calcul paresseux, des propriétés avec contrôle d'accès (getters/setters) et de gérer plus flexiblement le comportement des objets.