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

时间:2014-02-27 03:26:14

标签: 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';

2 个答案:

答案 0 :(得分:13)

从技术上讲,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:在严格模式下,它将 NOT 无声地失败并改为抛出错误

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

注2:如果您的对象有方法,那么JSON.stringify方法将 NOT 获取它们。您可以阅读有关在these three questions中正确克隆对象的详情。

答案 1 :(得分:2)

你不能:Source

  

冻结物体是锁定的最终形式。曾经是一个对象   已被冻结,它不能解冻 - 也不能被篡改   方式。这是确保您的对象保持不变的最佳方法   正如你离开他们一样,无限期。

从这里类似的问题:https://stackoverflow.com/a/19293418/1420186