TypeError: can't define property "x": "obj" is not extensible
Message
TypeError: Cannot create property for a non-extensible object (Edge) TypeError: can't define property "x": "obj" is not extensible (Firefox) TypeError: Cannot define property: "x", object is not extensible. (Chrome)
Type d'erreur
Quel est le problème ?
La plupart du temps, un objet est extensible, ce qui signifie qu'on peut lui ajouter de nouvelles propriétés. Cependant, dans ce cas, on a utilisé la méthode Object.preventExtensions()
afin de marquer l'objet comme non-extensible. Celui-ci ne pourra donc pas recevoir de nouvelles propriétés en plus de celles dont il dispose déjà.
Exemples
En mode strict, si on essaie d'ajouter une nouvelle propriété sur un objet non-extensible, on obtient une exception TypeError
. En mode non-strict, l'ajout de la nouvelle propriété est ignoré silencieusement.
"use strict";
var obj = {};
Object.preventExtensions(obj);
obj.x = "toto";
// TypeError: can't define property "x": "obj" is not extensible
Pour le mode strict ete le mode non-strict, un appel à Object.defineProperty()
déclenchera une exception lorsqu'on utilisera cette méthode pour ajouter une nouvelle propriété à un objet non-extenssible.
var obj = {};
Object.preventExtensions(obj);
Object.defineProperty(obj, "x", { value: "toto" });
// TypeError: can't define property "x": "obj" is not extensible
Pour corriger cet erreur, il faut retirer l'appel à Object.preventExtensions()
pour que l'objet soit extensible, soit ajouter la propriété avant que l'objet devienne non-extensible, soit retirer l'ajout de cette propriété si elle n'est pas nécessaire.
"use strict";
var obj = {};
obj.x = "toto"; // On ajoute la propriété avant de
// bloquer l'ajout d'autres propriétés
Object.preventExtensions(obj);