📜  JavaScript Object.freeze()(1)

📅  最后修改于: 2023-12-03 15:01:38.322000             🧑  作者: Mango

JavaScript Object.freeze()

简介

Object.freeze()是JavaScript中的一个函数,用于将对象冻结,使其变为不可更改。该函数会冻结对象的属性,使其不能删除、添加或修改。因此,该对象将变为只读。

语法
Object.freeze(obj)

其中,obj为要冻结的对象。

使用方法

Object.freeze()可以用于任何对象,包括普通对象、数组对象和函数对象。

1. 普通对象
const obj = {
    name: '张三',
    age: 18
}

Object.freeze(obj);

obj.name = '李四'; // 不会改变对象

Object.defineProperty(obj, 'name', {value: '李四'}); 
// 抛出错误,因为对象已被冻结

上述代码中,我们定义了一个普通对象obj,并使用Object.freeze()函数将其冻结。尝试修改对象属性name的值时,修改操作将被忽略。同时,使用Object.defineProperty()函数将name属性设置为新的值也会抛出错误,因为对象已被冻结。

2. 数组对象
const arr = [1, 2, 3];

Object.freeze(arr);

arr[0] = 4; // 不会改变数组

arr.pop(); 
// 不会改变数组,因为pop()函数会修改数组本身

上述代码中,我们定义了一个数组对象arr,并使用Object.freeze()函数将其冻结。尝试修改数组元素arr[0]的值时,修改操作将被忽略。同时,使用pop()函数弹出数组最后一个元素时,操作也将被忽略,因为该函数会修改数组本身。

注意:Object.freeze()只冻结对象本身,而不是对象的属性。即不能阻止添加或删除数组元素。如果要禁止修改整个数组,可以使用Object.seal()方法。

3. 函数对象
function func() { 
    return 'Hello, world!';
}

Object.freeze(func);

func = function() {}; 
// 不会改变函数对象,因为函数已被冻结

上述代码中,我们定义了一个函数对象func,并使用Object.freeze()函数将其冻结。尝试修改函数对象本身时,修改操作将被忽略。

注意事项
  1. Object.freeze()是浅冻结:即只有对象的第一层属性被冻结,而不是整个对象嵌套的所有对象和数组。如果需要深度冻结整个对象,需要使用递归方式将每一层对象和数组都冻结。

  2. Object.freeze()是不可逆的:一旦对象被冻结,就无法解冻。因此,在使用该函数前要仔细考虑是否需要更改该对象的属性。

  3. Object.freeze()是浅等式(Shallow equality):即对于指向同一个对象的不同引用(如变量、常量),如果其中一个引用的对象已被冻结,另一个引用也会受到影响。因此,在使用该函数时,应该特别注意对象的引用关系。

参考文献