Как оттаять / разморозить замороженный объект в Javascript? [дубликат]

этот вопрос уже есть ответ здесь:

не могли бы вы показать мне, как разморозить замороженный объект в Javascript, чтобы я мог изменить его свойства?

var pizza = {
    name: 'Peri Peri',
    Topping: 'Prawn'
};

Object.freeze(pizza);

// Can't change the name of the object because it's frozen
pizza.name = 'Hawaiian';

2 ответов


технически Object.freeze делает объект неизменяемым. Цитируя эту страницу,

ничего нельзя добавить или удалить из набора свойств замороженного объект. Любая попытка сделать это потерпит неудачу, либо молча, либо бросая исключение TypeError (чаще всего, но не исключительно, когда в строгий режим.)

значения не могут быть изменены для свойства данных. Аксессоры свойств (геттеры и сеттеры) работают одинаково (и все равно дают иллюзия, что вы меняете значение). Обратите внимание, что значения, объекты могут все еще модифицируются, если только они не заморожены.

Итак, единственный способ сделать это-клонировать объект

var pizza = {
    name: 'Peri Peri',
    Topping: 'Prawn'
};

Object.freeze(pizza);
pizza.name = 'Hawaiian';
console.log(pizza);
// { name: 'Peri Peri', Topping: 'Prawn' }

pizza = JSON.parse(JSON.stringify(pizza));  // Clones the object

pizza.name = 'Hawaiian';
console.log(pizza);
// { name: 'Hawaiian', Topping: 'Prawn' }

Примечание 1: в строгом режиме, он будет не сбой молча и бросить ошибку вместо

"use strict";
...
...
pizza.name = 'Hawaiian';
           ^
TypeError: Cannot assign to read only property 'name' of #<Object>

примечание 2: если ваш объект имеет методы, то JSON.stringify подход не получить их. Вы можете узнать больше о правильном клонировании объектов в эти три вопросы.


вы можете: источник

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

из аналогичного вопроса здесь:https://stackoverflow.com/a/19293418/1420186