Skip to content

JavaScript 对象的规则设置与保护机制 🔒 ​

在 JavaScript 中,我们有多种方式来保护对象的属性和结构。以下是三种主要的对象保护机制:

1. 冻结对象 (Object.freeze) ❄️ ​

冻结是最严格的对象保护机制,被冻结的对象将:

  • 🚫 不能修改现有属性的值
  • 🚫 不能删除现有属性
  • 🚫 不能添加新属性
  • 🚫 不能修改属性的特性(不能使用 Object.defineProperty)
javascript
const user = {
    name: "张三",
    age: 25
};

Object.freeze(user);

// 检查对象是否被冻结
console.log(Object.isFrozen(user)); // true

// 以下操作都会失败(在严格模式下会抛出错误)
user.name = "李四";      // 无效
user.address = "北京";   // 无效
delete user.age;        // 无效

2. 密封对象 (Object.seal) 🔐 ​

密封提供了相对较少的限制:

  • ✅ 可以修改现有属性的值
  • 🚫 不能添加新属性
  • 🚫 不能删除现有属性
  • 🚫 不能修改属性的特性
javascript
const user = {
    name: "张三",
    age: 25
};

Object.seal(user);

// 检查对象是否被密封
console.log(Object.isSealed(user)); // true

// 可以修改现有属性
user.name = "李四";     // 有效
// 但不能添加或删除属性
user.address = "北京";  // 无效
delete user.age;       // 无效

3. 禁止扩展 (Object.preventExtensions) 🚧 ​

最宽松的保护机制:

  • ✅ 可以修改现有属性的值
  • ✅ 可以删除现有属性
  • ✅ 可以修改属性的特性
  • 🚫 不能添加新属性
javascript
const user = {
    name: "张三",
    age: 25
};

Object.preventExtensions(user);

// 检查对象是否可扩展
console.log(Object.isExtensible(user)); // false

// 可以修改和删除现有属性
user.name = "李四";     // 有效
delete user.age;       // 有效
// 但不能添加新属性
user.address = "北京";  // 无效

注意事项 ⚠️ ​

  1. 这些保护机制都是浅层的,只对对象的直接属性生效
  2. 对于嵌套对象,需要递归应用这些方法才能实现深度保护
  3. 在严格模式下,违反这些规则会抛出 TypeError
  4. 一旦应用了这些保护机制,就不能撤销
  5. 建议在开发中根据实际需求选择合适的保护级别

实际应用场景 💡 ​

  • Object.freeze: 适用于配置对象、常量对象
  • Object.seal: 适用于需要固定属性集但允许修改值的对象
  • Object.preventExtensions: 适用于需要防止属性扩展但允许其他操作的对象
javascript
// 配置对象示例
const config = Object.freeze({
    API_URL: "https://api.example.com",
    MAX_RETRY: 3,
    TIMEOUT: 5000
});

// 用户对象示例
const userProfile = Object.seal({
    id: 1,
    name: "张三",
    score: 0
});

// 可修改的记录对象
const record = Object.preventExtensions({
    timestamp: Date.now(),
    value: 0
});