【问题标题】:How to thaw/defrost a frozen object in Javascript? [duplicate]如何在 Javascript 中解冻/解冻冻结的对象? [复制]
【发布时间】:2014-03-30 06:51:29
【问题描述】:

您能否告诉我如何在 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';

【问题讨论】:

  • 如果对象可以简单地解冻,那么冻结它的意义何在?

标签: javascript object


【解决方案1】:

从技术上讲,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' }

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

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

注意 2:如果您的对象有方法,那么 JSON.stringify 方法将获取它们。您可以在thesethreequestions 中阅读有关正确克隆对象的更多信息。

【讨论】:

  • 使用Object.create 会不会比使用 JSON 更短更快?
  • @DanD。但是我不能用Object.create 克隆,对吧?
【解决方案2】:

你不能:Source

冻结对象是锁定的最终形式。一旦一个对象 已被冻结,无法解冻 - 也无法以任何方式篡改 方式。这是确保您的对象保持不变的最佳方式 就像你离开他们一样,无限期地。

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

【讨论】:

猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多