mozilla
Vos résultats de recherche

    Object.seal()

    Résumé

    La méthode Object.seal() scelle un objet afin d'empêcher l'ajout de nouvelles propriétés, en marquant les propriétés existantes comme non-configurables. Les valeurs des propriétés courantes peuvent toujours être modifiées si elles sont accessibles en écriture.

    Syntaxe

    Object.seal(obj)

    Paramètres

    obj
    L'objet à sceller.

    Description

    Par défaut, les objets sont extensibles (ce qui signifie que de nouvelles propriétés peuvent leur être ajoutées). Sceller un objet empêche l'ajout de nouvelles propriétés et marque les propriétés existantes comme non-configurables. Ainsi, l'ensemble de propriétés de l'objet devient fixé et immuable. Le fait de rendre les propriétés non-configurables empêche également de transformer des propriétés de données en accesseurs et vice versa. Cela n'empêche pas de modifier la valeur des propriétés. Toute tentative de suppression ou d'ajout de propriétés à un objet qui est scellé, de conversion d'une propriété de données en accesseurs ou vice versa échouera, soit de manière silencieuse soit en lançant une exception TypeError (la plupart du temps en mode strict.

    La chaîne de prototypes reste la même. Cependant, la propriété __proto__ ( ) est scellée également.

    Exemples

    var obj = {
        prop: function () {},
        toto: "truc"
      };
    
    // On peut ajouter de nouvelles propriétés 
    // Les propriétés existantes peuvent être changées ou retirées
    obj.toto = "machin";
    obj.blop = "blip";
    delete obj.prop;
    
    var o = Object.seal(obj);
    
    assert(o === obj);
    assert(Object.isSealed(obj) === true);
    
    // On peut toujours changer la valeur d'une propriété
    // d'un objet scellé
    obj.toto = "moh";
    
    // Mais on ne peut pas convertir les données en accesseurs (ou vice versa)
    Object.defineProperty(obj, "toto", { get: function() { return "g"; } }); // lancera une TypeError
    
    // Tout autre changement que celui d'une valeur ne fonctionnera pas
    obj.coincoin = "mon canard"; // la propriété n'est pas ajoutée
    delete obj.toto; // la propriété n'est pas supprimée
    
    // ...en mode strict, cela lancera des TypeErrors
    function échec() {
      "use strict";
      delete obj.toto; // lance une TypeError
      obj.tutu = "arf"; // lance une TypeError
    }
    échec();
    
    // L'utilisation de la méthode Object.defineProperty ne fonctionnera pas
    Object.defineProperty(obj, "ohai", { value: 17 }); // lance une TypeError
    Object.defineProperty(obj, "toto", { value: "eit" }); // modifie une propriété existante

    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, un argument qui n'est pas un objet sera traité comme un objet ordinaire scellé et la méthode renverra cet objet.

    > Object.seal(1);
    TypeError : 1 n'est pas un objet // code ES5
    
    > Object.seal(1);
    1                                // code ES6

    Spécifications

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

    Compatibilité des navigateurs

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

    Basé sur le tableau de compatibilité de Kangax.

    Voir aussi

    Étiquettes et contributeurs liés au document

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