La méthode Object.preventExtensions()
permet d'empêcher l'ajout de nouvelles propriétés à un objet (i.e. d'étendre l'objet grâce à de nouvelles caractéristiques).
Syntaxe
Object.preventExtensions(obj)
Paramètres
obj
- L'objet qu'on souhaite rendre non-extensible.
Valeur de retour
L'objet rendu non-extensible.
Description
Un objet est extensible si on peut lui ajouter de nouvelles propriétés. Object.preventExtensions()
marque un objet et le rend non-extensible. Ainsi, cet objet ne pourra avoir d'autres propriétés que celles à l'instant où il a été marqué comme non-extensible. Attention, les propriétés existantes d'un objet non-extensible peuvent toujours être supprimées. Toute tentative d'ajout de nouvelles propriétés à un objet non-extensible échouera, soit de façon silencieuse, soit en levant une exception TypeError
(le plus souvent en mode strict).
Object.preventExtensions()
n'empêche que l'ajout des propriétés directement sur l'objet, il n'empêche pas d'ajouter des propriétés sur le prototype. Cependant, lorsqu'on appelle Object.preventExtensions()
sur un objet, cela empêchera également d'étendre sa propriété __proto__
.
Si, grâce à cette méthode, on peut rendre un objet non-extensible, il n'existe, avec ECMAScript 5, aucune méthode pour effectuer l'action inverse (rendre un objet non-extensible à nouveau extensible).
Exemples
// Object.preventExtensions renvoie l'objet non-extensible. var obj = {}; var obj2 = Object.preventExtensions(obj); obj === obj2; // true // Par défaut, les objets sont extensibles. var vide = {}; Object.isExtensible(vide); // true // ...mais cela peut être modifié. Object.preventExtensions(vide); Object.isExtensible(vide) === false); // Object.defineProperty lève une exception // lorsqu'on tente d'ajouter de nouvelles propriétés var nonExtensible = { removable: true }; Object.preventExtensions(nonExtensible); Object.defineProperty(nonExtensible, 'nouvelle', { value: 8675309 }); // lève une TypeError // En mode strict, toute tentative d'ajout // lève une exception TypeError function échec() { 'use strict'; nonExtensible.nouvelleProp = 'ÉCHEC'; // } échec(); // EXTENSION (ne fonctionne que pour les moteurs qui utilisent // __proto__ (qui est déprécié). Préférer Object.getPrototypeOf) : // Le prototype (via __proto__) d'un objet non-extensible // n'est pas modifiable : var fixed = Object.preventExtensions({}); fixed.__proto__ = { oh: 'hey' }; // lève une TypeError
Notes
Pour ES5, si l'argument passé à la méthode n'est pas un objet mais une valeur d'un autre type primitif, cela entraînera une exception TypeError
. Pour ES6, une valeur qui n'est pas un objet sera traitée comme un objet ordinaire qui n'est pas extensible et la méthode renverra cette valeur.
Object.preventExtensions(1); // TypeError : 1 n'est pas un object (code ES5) Object.preventExtensions(1); // 1 (code ES6)
Spécifications
Spécification | État | Commentaires |
---|---|---|
ECMAScript 5.1 (ECMA-262) La définition de 'Object.preventExtensions' dans cette spécification. |
Standard | Définition initiale. Implémentée avec JavaScript 1.8.5. |
ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'Object.preventExtensions' dans cette spécification. |
Standard | |
ECMAScript 2017 Draft (ECMA-262) La définition de 'Object.preventExtensions' dans cette spécification. |
Projet |
Compatibilité des navigateurs
Fonctionnalité | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Support simple | 6 | 4.0 (2.0) | 9 | 12 | 5.1 |
Comportement ES6 pour les arguments non-objets | 44 | 35.0 (35.0) | 11 | 31 | 9.0 |
Fonctionnalité | Android | Chrome pour Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Support simple | ? | ? | ? | ? | ? | ? |
Comportement ES6 pour les arguments non-objets | ? | ? | 35.0 (35.0) | ? | ? | 9.0 |