mozilla
Vos résultats de recherche

    Object.freeze()

    Résumé

    La méthode Object.freeze() permet de geler un objet, c'est-à-dire qu'on empêche d'ajouter de nouvelles propriétés, de supprimer ou d'éditer des propriétés existantes, y compris en ce qui concerne leur caractère énumérable, configurable ou pour l'accès en écriture. L'objet devient ainsi immuable. La méthode renvoie l'objet ainsi « gelé ».

    Syntaxe

    Object.freeze(obj)

    Paramètres

    obj
    L'objet à geler.

    Description

    Rien ne pourra être ajouté ou supprimé dans l'ensemble des propriétés de l'objet gelé. Toute tentative échouera, silencieusement ou via une exception TypeError (la plupart du temps en mode strict).

    Les propriétés qui sont des données ne pourront pas être changées. Les propriétés qui sont des accesseurs ou des mutateurs fonctionneront de la même façon (et ne changeront pas la valeur associée malgré le fait qu'il n'y ait pas d'erreur). Les propriétés dont les valeurs sont des objets pourront être modifiées si ces objets ne sont pas gelés.

    Exemples

    var obj = {
      prop: function (){},
      toto: "truc"
    };
    
    // On peut ajouter de nouvelles propriétés, éditer ou supprimer celles existantes
    obj.toto = "machin";
    obj.bidule = "woof";
    delete obj.prop;
    
    var o = Object.freeze(obj);
    
    assert(Object.isFrozen(obj) === true);
    
    // Maintenant que l'objet est gelé, les changements échoueront
    obj.toto = "eheh"; // échoue silencieusement
    obj.roxor = "ga bu zo meu"; // échoue silencieusement et n'ajoute pas la propriété
    
    // ...en mode strict, l'échec se traduira par une exception TypeErrors
    function echec(){
      "use strict";
      obj.toto = "bipbip"; // renvoie une TypeError
      delete obj.roxor;    // renvoie une TypeError
      obj.bipbip = "arf";  // renvoie une  TypeError
    }
    
    echec();
    
    // Les changements via Object.defineProperty échoueront également
    Object.defineProperty(obj, "ohoh", { value: 17 }); // renvoie une  TypeError
    Object.defineProperty(obj, "toto", { value: "eit" }); // renvoie une  TypeError

    L'exemple qui suit illustre comment les propriétés qui sont des objets peuvent être éditées (la méthode freeze ne s'applique que sur l'objet courant et de façon superficielle).

    obj = {
      internal : {}
    };
    
    Object.freeze(obj);
    obj.internal.a = "uneValeur";
    
    obj.internal.a // "uneValeur"
    
    // Pour rendre l'objet complètement immuable, on gèle chaque objet dans obj.
    // Pour ce faire, on utilise la fonction suivante :
    
    function deepFreeze (o) {
      var prop, propKey;
      Object.freeze(o); // On gèle l'objet courant
      for (propKey in o) {
        prop = o[propKey];
        if (!o.hasOwnProperty(propKey) || !(typeof prop === "object") || Object.isFrozen(prop)) {
          // Si l'objet n'est pas hérité du prototype, n'est pas un objet ou est déjà gelé
          // on passe. Note : s'il existe une référence non-gelée dans un des objets déjà gelé
          // il sera toujours possible de la modifier.
          continue;
        }
    
        deepFreeze(prop); // On appelle deepFreeze récursivement.
      }
    }
    
    obj2 = {
      internal : {}
    };
    
    deepFreeze(obj2);
    obj2.internal.a = "uneAutreValeur";
    obj2.internal.a; // undefined

    Notes

    Pour ES5, si l'argument passé à la méthode n'est pas un objet mais est d'un autre type primitif, cela entraînera une exception TypeError. Pour ES6, un argument qui n'est pas un objet sera traité comme un objet ordinaire gelé et sera renvoyé tel quel par la méthode.

    Spécifications

    Spécification Statut Commentaires
    ECMAScript 5.1 (ECMA-262)
    La définition de 'Object.freeze' dans cette spécification.
    Standard Définition initiale.
    Implémentée avec JavaScript 1.8.5
    ECMAScript 6 (ECMA-262)
    La définition de 'Object.freeze' dans cette spécification.
    Draft  

    Compatibilité des navigateurs

    Fonctionnalité Firefox (Gecko) Chrome Internet Explorer Opera Safari
    Support simple 4.0 (2) 6 9 12 5.1
    Fonctionnalité Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
    Support simple ? ? ? ? ?

    Tableau basé sur le tableau de compatibilité de Kangax.

    Voir aussi

    Étiquettes et contributeurs liés au document

    Contributors to this page: ChristopheBoucaut, SphinxKnight
    Dernière mise à jour par : ChristopheBoucaut,