返回

从三个角度探索原生 JavaScript 中的不可变对象创建方法

前端

JavaScript 语言的灵活性让开发者可以重新定义任何内容,但这在大型项目中可能成为问题。随着新版本 JavaScript 的发布,现在可以创建不可变对象了。

本文将从三个不同角度介绍如何在 JavaScript 中创建不可变对象:

  • 使用 Object.freeze() 方法
  • 使用 Object.seal() 方法
  • 使用 Object.preventExtensions() 方法

使用 Object.freeze() 方法

Object.freeze() 方法可以冻结一个对象,使其不可变。这意味着对象的所有属性都无法被重新定义或删除。

const car = {
  make: 'Toyota',
  model: 'Camry',
  year: 2020
};

Object.freeze(car);

car.make = 'Honda'; // TypeError: Cannot assign to read-only property 'make' of object '#<Object>'

使用 Object.seal() 方法

Object.seal() 方法可以密封一个对象,使其属性的值无法被重新定义,但属性本身可以被删除。

const car = {
  make: 'Toyota',
  model: 'Camry',
  year: 2020
};

Object.seal(car);

car.make = 'Honda'; // TypeError: Cannot assign to read-only property 'make' of object '#<Object>'
delete car.year; // true

console.log(car); // { make: 'Toyota', model: 'Camry' }

使用 Object.preventExtensions() 方法

Object.preventExtensions() 方法可以防止一个对象添加新的属性。

const car = {
  make: 'Toyota',
  model: 'Camry',
  year: 2020
};

Object.preventExtensions(car);

car.make = 'Honda'; // 成功
car.newProperty = 'New Value'; // TypeError: Cannot add property newProperty, object is not extensible

console.log(car); // { make: 'Honda', model: 'Camry', year: 2020 }

结论

JavaScript 中的不可变对象可以帮助开发者避免意外的修改,从而提高代码的稳定性和安全性。在需要保持数据完整性的情况下,可以使用 Object.freeze()Object.seal()Object.preventExtensions() 方法来创建不可变对象。