js实现不可变对象提案
使用 Object.freeze 方法
Object.freeze 可以冻结对象,使其属性不可修改、删除或添加。冻结后的对象变为不可变。
const obj = { a: 1, b: 2 };
Object.freeze(obj);
obj.a = 3; // 修改无效(严格模式下报错)
console.log(obj.a); // 输出 1
使用 Object.seal 方法
Object.seal 密封对象,阻止添加或删除属性,但允许修改现有属性。
const obj = { a: 1, b: 2 };
Object.seal(obj);
obj.a = 3; // 允许修改
delete obj.a; // 删除无效
console.log(obj.a); // 输出 3
使用 const 声明常量
const 声明的变量引用不可变,但对象内部属性仍可修改。结合 Object.freeze 可实现完全不可变。
const obj = Object.freeze({ a: 1 });
obj.a = 2; // 修改无效
使用 Immutable.js 库
Immutable.js 提供不可变数据结构(如 Map、List),所有修改操作返回新对象。
import { Map } from 'immutable';
const obj = Map({ a: 1 });
const newObj = obj.set('a', 2); // 返回新对象
console.log(obj.get('a')); // 输出 1
使用扩展运算符或 Object.assign 浅拷贝
通过浅拷贝生成新对象,避免直接修改原对象。适用于简单对象。
const obj = { a: 1 };
const newObj = { ...obj, a: 2 }; // 浅拷贝
// 或使用 Object.assign
const newObj2 = Object.assign({}, obj, { a: 2 });
使用 Proxy 拦截修改操作
通过 Proxy 拦截对象的 set 和 deleteProperty 操作,阻止修改。
const obj = { a: 1 };
const handler = {
set(target, prop, value) {
throw new Error('Cannot modify immutable object');
},
deleteProperty(target, prop) {
throw new Error('Cannot delete property from immutable object');
}
};
const immutableObj = new Proxy(obj, handler);
使用 Object.defineProperty 设置不可写属性
将对象的属性设置为不可写(writable: false),阻止修改。
const obj = {};
Object.defineProperty(obj, 'a', {
value: 1,
writable: false
});
obj.a = 2; // 修改无效(严格模式下报错)
使用 readonly 装饰器(TypeScript)
在 TypeScript 中,readonly 修饰符标记属性为只读。
interface ImmutableObj {
readonly a: number;
}
const obj: ImmutableObj = { a: 1 };
obj.a = 2; // 编译时报错






