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 : {} :
- 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 }.