📅  最后修改于: 2023-12-03 15:01:38.322000             🧑  作者: Mango
Object.freeze()
是JavaScript中的一个函数,用于将对象冻结,使其变为不可更改。该函数会冻结对象的属性,使其不能删除、添加或修改。因此,该对象将变为只读。
Object.freeze(obj)
其中,obj
为要冻结的对象。
Object.freeze()
可以用于任何对象,包括普通对象、数组对象和函数对象。
const obj = {
name: '张三',
age: 18
}
Object.freeze(obj);
obj.name = '李四'; // 不会改变对象
Object.defineProperty(obj, 'name', {value: '李四'});
// 抛出错误,因为对象已被冻结
上述代码中,我们定义了一个普通对象obj
,并使用Object.freeze()
函数将其冻结。尝试修改对象属性name
的值时,修改操作将被忽略。同时,使用Object.defineProperty()
函数将name
属性设置为新的值也会抛出错误,因为对象已被冻结。
const arr = [1, 2, 3];
Object.freeze(arr);
arr[0] = 4; // 不会改变数组
arr.pop();
// 不会改变数组,因为pop()函数会修改数组本身
上述代码中,我们定义了一个数组对象arr
,并使用Object.freeze()
函数将其冻结。尝试修改数组元素arr[0]
的值时,修改操作将被忽略。同时,使用pop()
函数弹出数组最后一个元素时,操作也将被忽略,因为该函数会修改数组本身。
注意:Object.freeze()
只冻结对象本身,而不是对象的属性。即不能阻止添加或删除数组元素。如果要禁止修改整个数组,可以使用Object.seal()
方法。
function func() {
return 'Hello, world!';
}
Object.freeze(func);
func = function() {};
// 不会改变函数对象,因为函数已被冻结
上述代码中,我们定义了一个函数对象func
,并使用Object.freeze()
函数将其冻结。尝试修改函数对象本身时,修改操作将被忽略。
Object.freeze()
是浅冻结:即只有对象的第一层属性被冻结,而不是整个对象嵌套的所有对象和数组。如果需要深度冻结整个对象,需要使用递归方式将每一层对象和数组都冻结。
Object.freeze()
是不可逆的:一旦对象被冻结,就无法解冻。因此,在使用该函数前要仔细考虑是否需要更改该对象的属性。
Object.freeze()
是浅等式(Shallow equality):即对于指向同一个对象的不同引用(如变量、常量),如果其中一个引用的对象已被冻结,另一个引用也会受到影响。因此,在使用该函数时,应该特别注意对象的引用关系。