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 = "北京"; // 无效注意事项 ⚠️
- 这些保护机制都是浅层的,只对对象的直接属性生效
- 对于嵌套对象,需要递归应用这些方法才能实现深度保护
- 在严格模式下,违反这些规则会抛出 TypeError
- 一旦应用了这些保护机制,就不能撤销
- 建议在开发中根据实际需求选择合适的保护级别
实际应用场景 💡
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
});