Подтвердить что ты не робот

Напротив Object.freeze или Object.seal в JavaScript

Что противоположно Object.freeze или Object.seal? Есть ли функция, которая имеет такое имя, как detach?

4b9b3361

Ответ 1

Нет способа сделать это, как только объект был заморожен, нет возможности разморозить его.

Источник

Замораживание объекта - это конечная форма блокировки. Как только объект был заморожен, он не может быть разморожен - и он не может быть манера. Это лучший способ убедиться, что ваши объекты останутся точно так же, как вы их оставили, неопределенно

Ответ 2

Я думаю, вы можете сделать, используя некоторые трюки:

  • Сначала создайте повторяющуюся временную переменную исходного объекта
  • затем установите для исходной переменной значение undefined
  • reset значение его из временного.

Код здесь:

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 not frozen anymore

Примечание. Имейте в виду, не делайте tempObj = obj, тогда это не сработает, потому что там также заморожен tempObj.

Заклинание здесь: http://jsfiddle.net/mpSYu/

Ответ 3

Проводное решение:)

 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;
 }

Рекомендации:


 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]

Ответ 4

Вы не можете разморозить замороженный объект.

Тем не менее, вы можете сделать так, чтобы такие отвратительные библиотеки не могли заморозить что-либо в будущем, переопределив метод Object.freeze как no-op:

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

В большинстве случаев этого достаточно. Просто запустите код выше, прежде чем библиотека будет загружена, и он больше не сможет заморозить что-либо.; )

Ответ 5

Протестировано в FF 52:

Что касается родительского объекта "замороженный объект" (символический) (где он символически ссылается, помимо других символических ссылок в других частях кода на один и тот же объект) НЕ ЗАМОРОЖЕН (например, окно), можно удалить его, тем не менее, с помощью оператора delete, - например:

удалить window.tinymce;

даже если window.tinymce был заморожен ДОПОЛНЕНИЕМ Object.freeze(window.tinymce); (иначе "родительский" стал бы каким-то "замороженным", как содержащим не разрушаемую ссылку на объект, что сделало бы символ НЕ-замороженного родителя не удаляемым...)

Поскольку у вас есть копия/клон/реконструкция/собственная версия/исходного объекта, уже сделанного перед удалением/удалением, который избавился/не имеет/от первоначальных ограничений (замороженный, расширяемый, настраиваемый, удобочитаемый и т.д. on), можно поставить/назначить ссылку на эту копию/клон/реконструкцию/собственную версию/в исходное символическое место, - вот так:

window.tinymce = the_copy_clone_reconstruction_own_version_object;

Удостоверьтесь, что этот экземпляр "copy_clone_reconstruction_own_version_object" в глобальной области не был удалён после завершения вашего кода обхода. [Фактически сам объект должен быть сброшен/освобожден/свободен, и только когда последняя ссылка на него была удалена из какой-либо области, - спустя некоторое время из-за сбора мусора, но я не уверен в приоритете выше, чем "функция закончена - отбросить все локальные вары" ]

НЕ тестировалось: Другие символические ссылки МОГУТ указывать на оригинальный, замороженный/ограниченный объект, кроме того, - как-то, что было установлено как

myobj.subobj = window.tinymce;

до начала ваших операций.

Подобные вещи (myobj.subobj), вероятно, (дайте ему попробовать!), кроме того, указывают на замороженный оригинал (?).

следующее понятие: НЕ тестировалось!

Как использовать функцию "прокси" для переноса значения-get/-set и другого поведения (функций,...) объекта с замороженным/закрытым или иным образом ограниченным (расширяемость,...)? Создано в GLOBAL-области, например  p = новый прокси (target, обработчик); или  window.p = новый прокси (target, обработчик);
// где target - объект для обертывания для перехвата/подключения/мониторинга, например, "window.tinymce"

В mdn-doc для темы-прокси говорится, что ограничения (замороженные,...) обернутого объекта сохраняются, но это может относиться к самому основному/оригинальному объекту (завернутому прокси-сервером) и, возможно, в конечном итоге НЕ будет ссылаться на мимику, сделанную прокси-сервером...

Правила области могут применяться, как указано выше...

Ответ 6

Вы не можете разморозить (разморозить) объект, но если этот объект является просто набором примитивов (без функций или классов), вы можете получить размороженный клон объекта следующим образом:

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

Ответ 7

Вы можете разморозить массив с помощью оператора распространения.

//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 

Ответ 8

Я тоже выпускал эту проблему. Чтобы исправить это, я использовал JavaScript JSON API, чтобы разморозить мой объект: const unfreezeObject = JSON.parse(JSON.stringify(freezeObject)). После этого я сделал все необходимые мутации.

Ответ 9

Я попробовал этот, и он работает нормально

let obj = {name:'Trickester', age:25}
 Object.freeze(obj)
 let newObj = obj
 obj = null
 obj = newObj
 //make whatever changes you