JavaScript Descrittori e proprietà denominate


Esempio

Le proprietà sono membri di un oggetto. Ogni proprietà denominata è una coppia di (nome, descrittore). Il nome è una stringa che consente l'accesso (utilizzando la notazione di punti object.propertyName o l' object['propertyName'] notazione parentesi quadre object['propertyName'] ). Il descrittore è un record di campi che definiscono il bevahiour della proprietà al momento dell'accesso (cosa succede alla proprietà e qual è il valore restituito dall'accesso). In generale, una proprietà associa un nome a un comportamento (possiamo pensare al comportamento come una scatola nera).

Esistono due tipi di proprietà denominate:

  1. proprietà dati : il nome della proprietà è associato a un valore.
  2. proprietà accessoria : il nome della proprietà è associato a una o due funzioni di accesso.

Dimostrazione:

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

Il tipo di proprietà è determinato dai campi del suo descrittore e una proprietà non può essere di entrambi i tipi.

Descrittori di dati -

  • Campi obbligatori: value o writable o entrambi
  • Campi opzionali: configurable , enumerable

Campione:

{
   value: 10,
   writable: true;
}

Descrittori degli accessori -

  • Campi obbligatori: get o set o entrambi
  • Campi opzionali: configurable , enumerable

Campione:

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

significato dei campi e dei loro valori predefiniti

configurable , enumerable e writable :

  • Queste chiavi sono tutte predefinite su false .
  • configurable è true se e solo se il tipo di questo descrittore di proprietà può essere cambiato e se la proprietà può essere cancellata dall'oggetto corrispondente.
  • enumerable è true se e solo se questa proprietà appare durante l'enumerazione delle proprietà sull'oggetto corrispondente.
  • writable è true se e solo se il valore associato alla proprietà può essere cambiato con un operatore di assegnazione.

get e set :

  • Queste chiavi sono predefinite in modo undefined .
  • get è una funzione che serve come getter per la proprietà, o undefined se non c'è getter. La funzione return verrà utilizzata come valore della proprietà.
  • set è una funzione che funge da setter per la proprietà, o undefined se non c'è setter. La funzione riceverà come argomento solo il nuovo valore assegnato alla proprietà.

value :

  • Questa chiave per impostazione predefinita undefined .
  • Il valore associato alla proprietà. Può essere un qualsiasi valore JavaScript valido (numero, oggetto, funzione, ecc.).

Esempio:

    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