entries javascript locking freeze

entries - Opuesto a Object.freeze o Object.seal en JavaScript



object is js (8)

¿Qué es lo contrario de Object.freeze o Object.seal ? ¿Hay alguna función que tenga un nombre como separar?


Solución cableada :)

Object.unfreeze=function(o){ var oo=undefined; if( o instanceof Array){ oo=[];var clone=function(v){oo.push(v)}; o.forEach(clone); }else if(o instanceof String){ oo=new String(o).toString(); }else if(typeof o ==''object''){ oo={}; for (var property in o){oo[property] = o[property];} } return oo; }

Mejores prácticas :

var obj={a:1,b:2} // {a:1,b:2} obj.c=3; //{a:1,b:2,c:3} Object.freeze(obj) //{a:1,b:2,c:3} obj.d=5; //Error: Read only object obj=Object.unfreeze(obj) //{a:1,b:2,c:3} obj.d=5; //{a:1,b:2,c:3,d:5}

var tab=[1,2,3] //[1,2,3] tab.push(4) //[1,2,3,4] Object.freeze(tab); //[1,2,3,4] tab.push(5) // Error : Ready only object tab=Object.unfreeze(tab); //[1,2,3,4] tab.push(9) //[1,2,3,4,9]


Creo que puedes hacerlo, usando algunos trucos:

  • Primero crea una variable temporal duplicada del objeto original
  • a continuación, establezca la variable original en indefinido
  • El restablecer el valor de la misma desde el temporal.

Código aquí:

var obj = {a : 5}; console.log(obj); // {a: 5} Object.freeze(obj); obj.b = 10; // trying to add something to obj var console.log(obj); // output: {a: 5} -> means its frozen // Now use this trick var tempObj = {}; for(var i in obj){ tempObj[i] = obj[i]; } console.log(tempObj); // {a: 5} // Resetting obj var obj = tempObj; console.log(obj);// {a: 5} obj.b = 10; // trying to add something to obj var console.log(obj); // output: {a: 5, b: 10} -> means it''s not frozen anymore

Nota: ten una cosa en mente, no hagas tempObj = obj , entonces no funcionará porque tempObj también está congelado allí.

Fiddle aquí: http://jsfiddle.net/mpSYu/


No hay manera de hacer esto, una vez que un objeto ha sido congelado, no hay manera de descongelarlo.

Source

La congelación de un objeto es la forma definitiva de bloqueo. Una vez que un objeto se ha congelado, no se puede descongelar ni se puede manipular de ninguna manera. Esta es la mejor manera de asegurarse de que sus objetos permanecerán exactamente como los dejó, indefinidamente


No puede descongelar (descongelar) un objeto, pero si el objeto es simplemente una colección de primitivos (sin funciones o clases), puede obtener un clon descongelado del objeto como este

const unfrozenObj = JSON.parse(JSON.stringify(frozenObj));


No puedes descongelar un objeto congelado.

Sin embargo, puedes hacer que las bibliotecas tan molestas no puedan congelar nada en el futuro, anulando el método Object.freeze para que no sea una opción:

Object.freeze = function(obj) { return obj; }; // just return the original object

En la mayoría de los casos esto es suficiente. Simplemente ejecute el código anterior antes de cargar la biblioteca, y ya no podrá congelar nada. ; )


Probado en FF 52:

En la medida en que NO se congele el objeto "congelado" (simbólico) del objeto congelado (al que se hace referencia simbólicamente, al lado / aparte de otras referencias simbólicas en otras partes del código para el mismo objeto), se puede aún así, elimínelo por el operador de eliminación, como:

eliminar window.tinymce;

incluso si window.tinymce había sido congelado ANTES por Object.freeze (window.tinymce); (de lo contrario, el ''padre'' se convertiría en una especie de "congelado" en sí mismo, ya que contiene una referencia de objeto no destructible, que haría que el símbolo del padre NO congelado no se pueda eliminar ...)

En cuanto a una copia / clonación / reconstrucción / versión propia / del objeto original ya realizada antes de la eliminación / eliminación, que eliminó / no tiene ninguna / de las restricciones originales (congelado, extensibilidad, configurabilidad, capacidad de escritura, etc.), uno puede poner / asignar una referencia a esa copia / clonación / reconstrucción / versión propia / al lugar simbólico original, - de esa manera:

window.tinymce = the_copy_clone_reconstruction_own_version_object;

¡Asegúrese de tener ese "copy_clone_reconstruction_own_version_object" en el ámbito global para que no se elimine después de que su código de solución haya finalizado! [En realidad, el objeto en sí mismo se debe eliminar / liberar su memoria / solo y solo cuando la última referencia a él se haya eliminado de cualquier ámbito, algún tiempo después, debido a la recolección de elementos no utilizados, pero no estoy seguro de la prioridad. más alto que la ''función finalizada - soltar todos los vars locales'']

NO probado: otras referencias simbólicas PUEDEN apuntar al objeto original, congelado / restringido, además, como algo que se estableció como

myobj.subobj = window.tinymce;

antes de que comenzaran tus operaciones.

Cosas como esa (myobj.subobj) probablemente (¡pruébelo!) Además apuntarán al original congelado (?).

próxima noción: NO probado!

¿Qué hay de usar la función ''proxy'' para envolver value-get / -set y otro comportamiento (funciones, ...) de un objeto congelado / sellado o restringido (extensibilidad, ...) de otra manera? Creado en el ámbito GLOBAL como p = nuevo Proxy (objetivo, controlador); o window.p = nuevo Proxy (objetivo, controlador);
// donde target es el objeto a envolver para la intercepción / conexión / monitoreo, como por ejemplo "window.tinymce"

El mdn-doc para el tema del proxy dice que las restricciones (congeladas, ...) del objeto envuelto se mantienen consideradas, pero que podrían referirse al objeto central / original en sí (envuelto por el proxy) y podrían eventualmente NO se refiere a la mímica hecha por el proxy ...

Las reglas de alcance podrían aplicarse como se mencionó anteriormente ...


Puede descongelar una matriz utilizando el operador de propagación.

//let suppose arr is a frozen array i.e. immutable var arr = [1, 2, 3]; //if arr is frozen arr you cannot mutate any array referring to it var temp = arr; temp.push(4); //throws an error "Cannot modify frozen array elements" //here mutableArr gets the elements of arr but not reference to it //hence you can mutate the mutableArr var mutableArr = [...arr]; mutableArr.push(4); //executes successfully


Yo también estaba ese problema. PARA solucionarlo, usé JavaScript JSON API para descongelar mi objeto: const unfreezeObject = JSON.parse(JSON.stringify(freezeObject)) . Después, hice todas las mutaciones que necesitaba.