Acabo de escuchar acerca de los métodos de JavaScript freezey seal, que se pueden usar para hacer que cualquier Objeto sea inmutable.
Aquí hay un breve ejemplo de cómo usarlo:
var o1 = {}, o2 = {};
Object.freeze(o2);
o1["a"] = "worked";
o2["a"] = "worked";
alert(o1["a"]); //prints "worked"
alert(o2["a"]); //prints "undefined"
¿Cuál es la diferencia entre freezey seal? ¿Pueden aumentar el rendimiento?
javascript
ecmascript-5
maja
fuente
fuente

Object.preventExtensionsademás deObject.sealyObject.freeze.Object.preventExtensionssolo evita que se agreguen nuevos elementos a un objeto. Puede eliminar, configurar y cambiar los valores de las propiedades en los objetos que tenían su extensibilidad desactivadaObject.preventExtensions.Respuestas:
Object.sealdeletedevolverá falsowritableatributo, y suvalueatributo siwriteablees verdadero).TypeErroral intentar modificar el valor del objeto sellado en sí (más comúnmente en modo estricto )Object.freezeObject.sealhace, más:Ninguno de los dos afecta a los objetos 'profundos' / nietos. Por ejemplo, si
objestá congelado,obj.elno se puede reasignar, peroobj.else puede modificar el valor de , por ejemplo,obj.el.idse puede cambiar.Actuación:
Sellar o congelar un objeto puede afectar su velocidad de enumeración, dependiendo del navegador:
Pruebas: objetos sellados , objetos congelados .
fuente
sealtambién hace que las propiedades existentes no sean configurables, consulte jsfiddle.net/btipling/6m743whn Número 2, aún puede editar, es decir, cambiar los valores de las propiedades existentes en un objeto sellado.onClickoonlick, y se preguntó por qué no está funcionando. Si JavaScript arroja un error, entonces esa es una cosa menos para equivocarse. En segundo lugar, esto le permite implementar propiedades constantes en un objeto que evita cambios. Esto es particularmente útil en métodos de objeto.Escribí un proyecto de prueba que compara estos 3 métodos:
Object.freeze()Object.seal()Object.preventExtensions()Las pruebas de mi unidad cubren casos de CRUD:
Resultado:
fuente
DEBUGMODEvariable y configúrela comotrue. Entonces hazloif (DEBUGMODE) { ... }. En el..., coloque su funcionalidad para garantizar que todos los objetos DOM estén siempre sellados. Luego, cuando esté listo para distribuir el script página web, el cambioDEBUGMODEafalse, ejecute la secuencia de comandos a través del compilador de cierre, y distribuirlo. Es tan simple como eso.element.onlick=somethingy frustrados porque no funciona, pero técnicamente no es un error.Siempre puedes buscarlos en MDN. En breve:
fuente
Object.seal()También parece congelar las propiedades del prototipo: \Object.freeze()crea un objeto congelado, lo que significa que toma un objeto existente y esencialmente lo invocaObject.seal(), pero también marca todas las propiedades de "acceso a datos" comowritable:false, de modo que sus valores no se pueden cambiar. - Kyle Simpson, You Don't Know JS - This & Object Prototypesfuente
Estaba mirando las diferencias entre Freeze y Seal en ECMAScript 5 y creé un script para aclarar las diferencias. Frozen crea un objeto inmutable que incluye datos y estructura. Seal evita los cambios en las interfaces con nombre (sin adiciones ni eliminaciones), pero puede mutar el objeto y redefinir el significado de su interfaz.
fuente
Sé que puedo llegar un poco tarde pero
false. donde, como en Sealed, el atributo de escritura se establece entruey el resto de los atributos son falsos.fuente
Object.getOwnPropertyDescriptor(Object.freeze({ prop: 1 }), 'prop').enumerable===true.Ahora puede forzar la congelación de una propiedad de un solo objeto en lugar de congelar todo el objeto. Puede lograr esto
Object.definePropertyconwritable: falsecomo parámetro.En este ejemplo,
obj.firstahora tiene su valor bloqueado en 99.fuente
He creado una tabla simple para comparar las funciones a continuación y explicar la diferencia entre estas funciones.
fuente