Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

Object : méthode statique preventExtensions()

Baseline Large disponibilité

Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2015.

La méthode statique Object.preventExtensions() empêche l'ajout de nouvelles propriétés à un objet (c'est-à-dire empêche les extensions futures de l'objet). Elle empêche également la réaffectation du prototype de l'objet.

Exemple interactif

const object = {};

Object.preventExtensions(object);

try {
  Object.defineProperty(object, "toto", {
    value: 42,
  });
} catch (e) {
  console.log(e);
  // Résultat attendu : TypeError: Impossible de définir la propriété toto, l'objet n'est pas extensible
}

Syntaxe

js
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 de nouvelles propriétés peuvent lui être ajoutées. Object.preventExtensions() marque un objet comme n'étant plus extensible, de sorte qu'il n'a jamais de propriétés au-delà de celles qu'il possède au moment où il a été marqué comme non extensible. Notez que les propriétés d'un objet non extensible, en général, peuvent encore être supprimées. Tenter d'ajouter de nouvelles propriétés à un objet non extensible échoue, soit silencieusement, soit, en mode strict, en lançant une TypeError.

Contrairement à Object.seal() et Object.freeze(), Object.preventExtensions() invoque un comportement intrinsèque de JavaScript et ne peut pas être remplacé par une composition de plusieurs autres opérations. Il a également son homologue Reflect (qui n'existe que pour les opérations intrinsèques), Reflect.preventExtensions().

Object.preventExtensions() empêche uniquement l'ajout de propriétés propres. Des propriétés peuvent encore être ajoutées au prototype de l'objet.

Cette méthode rend le [[Prototype]] de la cible immuable ; toute réaffectation de [[Prototype]] lève une TypeError. Ce comportement est spécifique à la propriété interne [[Prototype]] ; les autres propriétés de l'objet cible restent mutables.

Il n'existe aucun moyen de rendre un objet extensible à nouveau une fois qu'il a été rendu non extensible.

Exemples

Utiliser Object.preventExtensions()

js
// Object.preventExtensions retourne l'objet
// qui n'est pas extensibles.
const obj = {};
const obj2 = Object.preventExtensions(obj);
obj === obj2; // true

// Par défaut, les objets sont extensibles.
const vide = {};
Object.isExtensible(vide); // true

// Ils peuvent être rendus non extensibles
Object.preventExtensions(vide);
Object.isExtensible(vide); // false

// Object.defineProperty lève une exception
// lorsqu'on tente d'ajouter de nouvelles propriétés
const nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, "new", {
  value: 8675309,
}); // lève une TypeError

// En mode strict, toute tentative d'ajout d'une propriété
// à un objet qui n'est pas extensible lève une exception TypeError
function echec() {
  "use strict";
  // lève une TypeError
  nonExtensible.newProperty = "FAIL";
}
echec();

Le prototype d'un objet non extensible est immuable :

js
const fixe = Object.preventExtensions({});
// lève une TypeError
fixe.__proto__ = { oh: "hey" };

Argument d'une valeur primitive

Dans ES5, si l'argument passé à cette méthode n'est pas un objet (un primitif), cela entraîne une exception TypeError. Dans ES2015, elle retourne false sans aucune erreur si un argument non-objet est passé, puisque les primitifs sont, par définition, immuables.

js
Object.preventExtensions(1);
// TypeError : 1 n'est pas un objet (code ES5)

Object.preventExtensions(1);
// 1                                (code ES2015)

Spécifications

Spécification
ECMAScript® 2027 Language Specification
# sec-object.preventextensions

Compatibilité des navigateurs

Voir aussi