JavaScript Descripteurs et propriétés nommées


Exemple

Les propriétés sont membres d'un objet. Chaque propriété nommée est une paire de (nom, descripteur). Le nom est une chaîne qui permet l'accès (en utilisant la notation par points object.propertyName ou l' object['propertyName'] notation entre crochets object['propertyName'] ). Le descripteur est un enregistrement de champs définissant le bevahiour de la propriété à laquelle il est accédé (ce qui arrive à la propriété et quelle est la valeur renvoyée pour y accéder). En gros, une propriété associe un nom à un comportement (on peut considérer le comportement comme une boîte noire).

Il existe deux types de propriétés nommées:

  1. propriété data : le nom de la propriété est associé à une valeur.
  2. propriété accesseur : le nom de la propriété est associé à une ou deux fonctions d'accès.

Manifestation:

obj.propertyName1 = 5; //translates behind the scenes into
                       //either assigning 5 to the value field* if it is a data property
                //or calling the set function with the parameter 5 if accessor property


//*actually whether an assignment would take place in the case of a data property
//also depends on the presence and value of the writable field - on that later on

Le type de la propriété est déterminé par les champs de son descripteur et une propriété ne peut pas être des deux types.

Descripteurs de données -

  • Champs obligatoires: value ou writable ou les deux
  • Champs facultatifs: configurable , enumerable

Échantillon:

{
   value: 10,
   writable: true;
}

Descripteurs d'accès -

  • Champs obligatoires: get ou set ou les deux
  • Champs facultatifs: configurable , enumerable

Échantillon:

{
    get: function () {
        return 10;
    },
    enumerable: true
}

signification des champs et leurs valeurs par défaut

configurable , enumerable et writable :

  • Ces touches sont toutes false par défaut.
  • configurable est true si et seulement si le type de ce descripteur de propriété peut être modifié et si la propriété peut être supprimée de l'objet correspondant.
  • enumerable est true si et seulement si cette propriété apparaît lors de l'énumération des propriétés sur l'objet correspondant.
  • writable est true si et seulement si la valeur associée à la propriété peut être modifiée avec un opérateur d'affectation.

get et set :

  • Ces touches sont undefined par défaut sur undefined .
  • get est une fonction qui sert de getter pour la propriété, ou undefined s'il n'y a pas de getter. La fonction return sera utilisée comme valeur de la propriété.
  • set est une fonction qui sert de setter pour la propriété, ou undefined s'il n'y a pas de setter. La fonction recevra comme seul argument la nouvelle valeur affectée à la propriété.

value :

  • Cette clé est undefined défaut sur undefined .
  • La valeur associée à la propriété. Peut être une valeur JavaScript valide (nombre, objet, fonction, etc.).

Exemple:

    var obj = {propertyName1: 1}; //the pair is actually ('propertyName1', {value:1,
                                                                    // writable:true,
                                                                    // enumerable:true,
                                                                    // configurable:true})
    Object.defineProperty(obj, 'propertyName2', {get: function() {
                                                    console.log('this will be logged ' + 
                                 'every time propertyName2 is accessed to get its value');
                                                },
                                            set: function() {
                                                    console.log('and this will be logged ' + 
                                'every time propertyName2\'s value is tried to be set')
                      //will be treated like it has enumerable:false, configurable:false
                                                }});
//propertyName1 is the name of obj's data property 
//and propertyName2 is the name of its accessor property





obj.propertyName1 = 3;
console.log(obj.propertyName1); //3

obj.propertyName2 = 3; //and this will be logged every time propertyName2's value is tried to be set
console.log(obj.propertyName2); //this will be logged every time propertyName2 is accessed to get its value