Что противоположно Object.freeze
или Object.seal
? Есть ли функция, которая имеет такое имя, как detach?
Напротив Object.freeze или Object.seal в JavaScript
Ответ 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