Acabo de escuchar acerca de los métodos de JavaScript freeze
y 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 freeze
y seal
? ¿Pueden aumentar el rendimiento?
javascript
ecmascript-5
maja
fuente
fuente
Object.preventExtensions
además deObject.seal
yObject.freeze
.Object.preventExtensions
solo 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.seal
delete
devolverá falsowritable
atributo, y suvalue
atributo siwriteable
es verdadero).TypeError
al intentar modificar el valor del objeto sellado en sí (más comúnmente en modo estricto )Object.freeze
Object.seal
hace, más:Ninguno de los dos afecta a los objetos 'profundos' / nietos. Por ejemplo, si
obj
está congelado,obj.el
no se puede reasignar, peroobj.el
se puede modificar el valor de , por ejemplo,obj.el.id
se 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
seal
tambié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.onClick
oonlick
, 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
DEBUGMODE
variable 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 cambioDEBUGMODE
afalse
, ejecute la secuencia de comandos a través del compilador de cierre, y distribuirlo. Es tan simple como eso.element.onlick=something
y 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 entrue
y 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.defineProperty
conwritable: false
como parámetro.En este ejemplo,
obj.first
ahora 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