如何在Javascript中解冻/解冻冻结对象?

Toa*_*yen 9 javascript object

你能告诉我如何在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';
Run Code Online (Sandbox Code Playgroud)

the*_*eye 13

从技术上讲,Object.freeze使对象不可变.从该页面引用,

无法在冻结对象的属性集中添加或删除任何内容.任何这样做的尝试都会失败,无论是静默还是抛出TypeError异常(最常见,但不是唯一的,在严格模式下).

无法更改数据属性的值.访问器属性(getter和setter)的工作方式相同(并且仍然给出了您正在更改值的错觉).请注意,仍然可以修改作为对象的值,除非它们也被冻结.

因此,通过克隆对象,唯一可行的方法就是这样做

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' }
Run Code Online (Sandbox Code Playgroud)

注1:在严格模式下,它不会以静默方式失败并改为抛出错误

"use strict";
...
...
pizza.name = 'Hawaiian';
           ^
TypeError: Cannot assign to read only property 'name' of #<Object>
Run Code Online (Sandbox Code Playgroud)

注意2:如果你的对象有方法,那么JSON.stringify方法就不会得到它们.您可以在 三个 问题中阅读有关正确克隆对象的更多信息.