4 votes

Comment l'objet JS est-il mutable si la propriété writable a la valeur false par défaut ?

J'essaie de comprendre comment fonctionne la mutation d'objet en JS. Je suis tombé sur la propriété writable en JS.

var x = {name:'JohnSnow'};

Object.defineProperty(x, 'name', {
   writable: false
};

Maintenant, changer le name n'a aucun effet sur l'objet x . C'est compréhensible car j'ai modifié son writable à la propriété false .

Cependant, tous les documents que j'ai lus, y compris ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties#Parameters ) dit que cette propriété est false par défaut.

Si le writable est réglé sur false par défaut, l'objet ne devrait-il pas être immuable par défaut et ne devrait-il pas devenir mutable qu'après avoir défini le paramètre writable a true .

Ai-je mal compris le concept de propriétés d'objet, car je pense que tous les objets en JS ont ceci config et chaque objet a writable propriété.

5voto

CertainPerformance Points 110949

Object.defineProperty ne doit généralement être utilisé que pour définir un nouveau sinon, l'objet descripteur de propriété transmis sera souvent partiellement ignoré, comme décrit à la section étape 2 de 9.1.6.3 ValidateAndApplyPropertyDescriptor .

À l'étape 2, le nouveau descripteur, desc ne sera mis comme nouveau descripteur de propriété que si le descripteur actuel est indéfini.

À l'étape 6, une propriété de données existante peut être transformée en une propriété d'accès (ou l'inverse), mais

Conservez les valeurs existantes des attributs [[Configurable]] et [[Enumérable]] de la propriété convertie et définissez le reste des attributs de la propriété à leur valeur maximale. Valeurs par défaut .

Les étapes 7 et 8 ne modifient pas le descripteur actuel, elles vérifient simplement et renvoient une valeur.

Ainsi, quel que soit le descripteur passé, si la propriété existe déjà sur l'objet, la fonction writable (ou son absence) du "nouveau" descripteur sera complètement ignorée.


writable est par défaut false mais uniquement lors de l'utilisation de Object.defineProperty .

var x = {};

Object.defineProperty(x, 'name', {
   value: 'foo'
});

x.name = 'bar';
console.log(x.name);

Comme vous pouvez le voir ci-dessus, si vous ne fournissez pas un writable lors de l'appel Object.defineProperty la valeur par défaut sera false . C'est todo cela signifie qu'il ne s'agit pas de spécifier que les propriétés sont toujours non-écrites par défaut, mais seulement que les propriétés sont non-écrites. lors de la définition d'une propriété avec Object.defineProperty .

Les propriétés d'un objet sont accessibles en écriture lorsqu'on définit un objet à l'aide d'un littéral d'objet, décrit dans la rubrique 12.2.6.7 Sémantique d'exécution : Évaluation ObjectLiteral : {} :

  1. Perform ? PropertyDefinitionEvaluation de PropertyDefinitionList avec les arguments obj et true.

Quel éventuellement vous conduit à :

CreateDataProperty ( O, P, V ) :

Soit newDesc le PropertyDescriptor { [[Value]] : V, [[Inscriptible]] : vrai , [[Enumérable]] : true, [[Configurable]] : true }.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X