您能否告诉我如何在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';
答案 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
冻结物体是锁定的最终形式。曾经是一个对象 已被冻结,它不能解冻 - 也不能被篡改 方式。这是确保您的对象保持不变的最佳方法 正如你离开他们一样,无限期。