你能告诉我如何在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方法就不会得到它们.您可以在这 三个 问题中阅读有关正确克隆对象的更多信息.
| 归档时间: |
|
| 查看次数: |
4412 次 |
| 最近记录: |