Le livre, PROFESSIONAL JavaScript ® for Web Developers Third Edition, dit:

De plus, une fois qu'une propriété a été définie comme non configurable, elle ne peut pas redevenir configurable. Toute tentative d'appeler Object.defineProperty () et de modifier tout attribut autre que accessible en écriture provoque une erreur.

'use strict';
var obj = {};
Object.defineProperty(obj, 'key',  {
  value:'static'
});

Object.defineProperty(obj, 'key', {
  writable: true,
});

J'écris un extrait de code ci-dessus, mais il génère une erreur. Le livre dit que je peux redéfinir les attributs inscriptibles. Pourquoi cela provoque-t-il une erreur?

0
Micheal_Song 9 août 2016 à 09:12

3 réponses

Meilleure réponse

Pourquoi cela provoque-t-il une erreur?

MDN dit:

Si une propriété n'est pas configurable, son attribut writable ne peut être modifié qu'en false.

Donc, l'énoncé dans le livre n'est pas assez précis: vous pouvez modifier writable sur une propriété non configurable, mais uniquement de true à false, et non l'inverse, c'est ce que vous essayez de faire.

1
Felix Kling 9 août 2016 à 06:38

Une propriété ne peut être changée de non inscriptible à inscriptible que si son attribut configurable est vrai. (ECMA-262 7e éd., § 6.1.7.1) Par défaut, c'est faux.

Si vous souhaitez configurer des métadonnées pour la propriété après sa création, ajoutez configurable: true au premier defineProperty.

'use strict';
var obj = {};
Object.defineProperty(obj, 'key',  {
  value:'static',
  configurable: true
});

Object.defineProperty(obj, 'key', {
  writable: true,
});

console.log(Object.getOwnPropertyDescriptor(obj, 'key'));
1
cHao 9 août 2016 à 06:40

Lorsque vous ignorez les descripteurs de propriété dans Object.defineProperty, ils prennent plutôt une valeur par défaut.

Dans le cas du descripteur writable, la valeur par défaut est false, ce qui signifie que ne pas le définir la première fois a le même effet que celui-ci:

Object.defineProperty(obj, 'key',  {
  value:'static',
  writable: false
});

Si vous définissez explicitement writable sur true et réexécutez le code, vous verrez qu'aucune exception n'est levée.

0
Guybrush Threepwood 9 août 2016 à 06:27