En JavaScript, l'attribut extensible d'un objet est utilisé pour indiquer si de nouvelles propriétés peuvent être ajoutées dynamiquement à l'objet. Dans le standard ECMAScript 3, tous les objets sont extensibles. Dans la norme ECMAScript 5, tous les objets sont toujours extensibles par défaut, mais cet attribut peut être modifié en le définissant.
Pour demander si un objet est extensible, vous pouvez utiliser l'instruction Object.isExtensible() :
Pour rendre un objet non extensible, vous pouvez utiliser l'instruction Object.preventExtensions() :
Il convient de noter que puisqu'il n'y a pas d'instruction d'opération inverse de Object.preventExtensions(), une fois qu'un objet est défini comme non extensible, il n'y a aucun moyen de le définir à nouveau comme extensible.
La portée de l'instruction Object.preventExtensions() est l'objet lui-même et l'objet prototype n'est pas affecté. Si un objet est défini comme non extensible, les propriétés peuvent toujours être ajoutées dynamiquement à son objet prototype, et ces propriétés ajoutées dynamiquement peuvent toujours être héritées par l'objet.
Object.seal() et Object.freeze()
Object.preventExtensions() peut empêcher l'ajout dynamique de nouvelles propriétés à l'objet. En plus de cette opération, il existe deux autres opérations plus strictes en JavaScript pour protéger les objets : Object.seal() et Object.freeze().
La fonction de Object.seal() est de définir la propriété configurable des propres propriétés de tous les objets sur false en fonction de Object.preventExtensions(). Comme l'opération Object.preventExtensions(), Object.seal() n'a pas d'opération inverse, donc une fois l'objet scellé, son état ne peut pas être restauré. En JavaScript, vous pouvez utiliser Object.isSealed() pour demander si un objet a été scellé.
La fonction de Object.freeze() est de définir les propriétés de tous les objets eux-mêmes en lecture seule en fonction de Object.seal(). Comme les opérations Object.seal() et Object.preventExtensions(), Object.freeze() n'a pas d'opération inverse, donc une fois l'objet gelé, son état ne peut pas être restauré. En JavaScript, vous pouvez utiliser Object.isFrozen() pour demander si un objet a été gelé.
Qu'il s'agisse de Object.preventExtensions(), Object.seal() et Object.freeze(), sa portée est l'objet lui-même et l'objet prototype de l'objet ne sera pas affecté.