Sobes.tech
Middle+

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. Si true, la valeur de la propriété peut être modifiée (obj.prop = newValue). Par défaut, false pour les propriétés d'accès et true pour les propriétés de données créées par assignation normale.
    • enumerable : Un booléen. Si true, la propriété sera visible lors de l'itération sur les propriétés de l'objet (par exemple, dans une boucle for...in ou en utilisant Object.keys()). Par défaut, false pour les propriétés ajoutées avec Object.defineProperty et true pour celles créées par assignation normale.
    • configurable : Un booléen. Si true, les caractéristiques du descripteur (sauf value et writable lorsqu'ils changent de données à accessoires) peuvent être modifiées, et la propriété peut être supprimée. Par défaut, false pour les propriétés ajoutées avec Object.defineProperty (sauf value) et true pour 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.