Je viens d'entendre parler des méthodes JavaScript freeze
et seal
, qui peuvent être utilisées pour rendre tout objet immuable.
Voici un petit exemple comment l'utiliser:
var o1 = {}, o2 = {};
Object.freeze(o2);
o1["a"] = "worked";
o2["a"] = "worked";
alert(o1["a"]); //prints "worked"
alert(o2["a"]); //prints "undefined"
Quelle est la différence entre freeze
et seal
? Peuvent-ils augmenter les performances?
Object.preventExtensions
en plus deObject.seal
etObject.freeze
.Object.preventExtensions
empêche simplement de nouveaux éléments d'être ajoutés à un objet. Vous pouvez supprimer, configurer et modifier les valeurs des propriétés d’objets dont l’extensibilité est désactivée avecObject.preventExtensions
.Réponses:
Object.seal
delete
retournera falsewritable
attribut, et leurvalue
attribut siwriteable
est vrai).TypeError
lors d' une tentative de modification de la valeur de l'objet scellé lui-même (le plus souvent en mode strict )Object.freeze
Object.seal
fait, plus:Aucun des deux n'affecte les objets «profonds» / petits-enfants. Par exemple, si
obj
est gelé,obj.el
ne peut pas être réaffecté, mais la valeur deobj.el
pourrait être modifiée, par exempleobj.el.id
peut être modifiée.Performance:
Le scellement ou le gel d'un objet peut affecter sa vitesse d'énumération, selon le navigateur:
Tests: objets scellés , objets congelés .
la source
seal
rend également les propriétés existantes non configurables, voir jsfiddle.net/btipling/6m743whn Numéro 2, vous pouvez toujours modifier, c'est-à-dire modifier les valeurs des propriétés existantes sur un objet scellé.onClick
ouonlick
et se sont demandé pourquoi cela ne fonctionnait pas. Si JavaScript génère une erreur, c'est une chose de moins à se tromper. Deuxièmement, cela vous permet d'implémenter des propriétés constantes sur un objet, ce qui empêche les modifications. Ceci est particulièrement utile sur les méthjods d'objets.J'ai écrit un projet de test qui compare ces 3 méthodes:
Object.freeze()
Object.seal()
Object.preventExtensions()
Mes tests unitaires couvrent les cas CRUD:
Résultat:
la source
DEBUGMODE
variable et définissez-la surtrue
. Alors faisif (DEBUGMODE) { ... }
. Dans le...
, mettez vos fonctionnalités pour vous assurer que tous les objets DOM sont toujours scellés. Ensuite, lorsque vous êtes prêt à distribuer votre script de page Web , passezDEBUGMODE
àfalse
, exécutez votre script via le compilateur de fermeture et distribuez-le. C'est aussi simple que ça.element.onlick=something
et qui deviennent frustrés parce que cela ne fonctionne pas, mais ce n'est pas techniquement une erreur.Vous pouvez toujours les rechercher dans MDN. En bref:
la source
Object.seal()
semble également geler les propriétés du prototype: \Object.freeze()
crée un objet figé, ce qui signifie qu'il prend un objet existant et l'appelle essentiellementObject.seal()
, mais il marque également toutes les propriétés de l '«accesseur de données» commewritable:false
, de sorte que leurs valeurs ne peuvent pas être modifiées. - Kyle Simpson, vous ne connaissez pas JS - Prototypes ceci et objetla source
Je regardais les différences entre Freeze et Seal dans ECMAScript 5 et j'ai créé un script pour clarifier les différences. Frozen crée un objet immuable comprenant des données et une structure. Seal empêche les modifications des interfaces nommées - pas d'ajouts, ni de suppressions - mais vous pouvez muter l'objet et redéfinir la signification de son interface.
la source
Je sais que je suis peut-être un peu en retard mais
false
. où, comme dans l' attribut inscriptible scellé, est défini surtrue
et le reste des attributs est faux.la source
Object.getOwnPropertyDescriptor(Object.freeze({ prop: 1 }), 'prop').enumerable
===true
.Vous pouvez maintenant forcer une propriété d'objet unique à être gelée au lieu de geler l'objet entier. Vous pouvez y parvenir
Object.defineProperty
avecwritable: false
comme paramètre.Dans cet exemple, a
obj.first
maintenant sa valeur verrouillée à 99.la source
J'ai créé un tableau simple pour comparer les fonctions ci-dessous et expliquer la différence entre ces fonctions.
la source