📜  如何在 JavaScript 中深度冻结对象?

📅  最后修改于: 2022-05-13 01:56:29.857000             🧑  作者: Mango

如何在 JavaScript 中深度冻结对象?

在本文中,我们将了解 JavaScript 中的对象存在什么问题,以及为什么我们需要在 JavaScript 中“深度冻结”对象。我们还将学习如何在 JavaScript 中“深度冻结”对象。

JavaScript 中的对象问题:我们都知道 JavaScript 对象是可变的。我们怎样才能使它们不可变?将它们定义为const但如果我们将 JavaScript 对象声明为const,它只会阻止对象作为一个整体被重新分配。我们仍然可以重新分配属性并更改它们的值。

示例 1:

HTML


Javascript
const obj1={key1:"val1", key2:"val2", key3:"val3"}
console.log("Before Change")
console.log(obj1);
Object.freeze(obj1);
obj1.key1="val";
console.log("After Change")
console.log(obj1);


HTML


HTML


输出:

"Before Change"
{
 key1: "val1",
 key2: "val2",
 key3: "val3"
}
"After Change"
{
 key1: "val",
 key2: "val2",
 key3: "val3"
}

如何解决上述问题?

我们可以使用 JavaScript 提供的 Object.freeze() 方法来防止通过更新和删除现有属性来添加新属性。

示例 2:

Javascript

const obj1={key1:"val1", key2:"val2", key3:"val3"}
console.log("Before Change")
console.log(obj1);
Object.freeze(obj1);
obj1.key1="val";
console.log("After Change")
console.log(obj1);

输出:

"Before Change"
{
key1: "val1",
key2: "val2",
key3: "val3"
}
"After Change"
{
key1: "val1",
key2: "val2",
key3: "val3"
}

这不是最好的方法,因为它只会创建一个浅对象冻结,并且如果对象具有一些嵌套对象/数组作为属性,则仍然可以修改嵌套对象/数组。

示例 3:

HTML


输出:这是我们需要为对象创建深度冻结的情况。

"Before Change"
{
 key1: "val1",
 key2: "val2",
 key3: ["val3", "val4", "val5"]
}
"After Change"
{
 key1: "val1",
 key2: "val2",
 key3: ["val", "val", "val"]
}

如何实施?

我们将使用递归来实现对象的深度冻结。这个想法是检查每个属性是否是一个对象。如果属性是一个对象,我们将检查它是否被冻结。如果未冻结,则递归调用该属性的冻结函数。这样,我们将创建对象的深度冻结。

示例 4:

HTML


输出:

"Before Change"
{
 key1: "val1",
 key2: "val2",
 key3: ["val3", "val4", "val5"]
}
"After Change"
{
 key1: "val1",
 key2: "val2",
 key3: ["val3", "val4", "val5"]
}