当前位置:首页 > JavaScript

js实现不可变对象提案

2026-03-01 23:45:43JavaScript

使用 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 提供不可变数据结构(如 MapList),所有修改操作返回新对象。

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 拦截对象的 setdeleteProperty 操作,阻止修改。

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 修饰符标记属性为只读。

js实现不可变对象提案

interface ImmutableObj {
  readonly a: number;
}
const obj: ImmutableObj = { a: 1 };
obj.a = 2; // 编译时报错

标签: 提案对象
分享给朋友:

相关文章

js对象展开 实现

js对象展开 实现

对象展开语法(Spread Syntax) 对象展开语法(...)允许将一个对象的可枚举属性展开到另一个对象中,常用于合并、复制或覆盖对象属性。 基本用法 通过 ... 展开对象属性到新对象:…

jquery循环遍历对象

jquery循环遍历对象

jQuery 遍历对象的方法 在 jQuery 中,可以使用多种方式遍历对象或集合。以下是几种常见的遍历方法: 使用 $.each() 遍历对象或数组 $.each() 是 jQuery 提供的通用…

java如何初始化对象

java如何初始化对象

初始化对象的方法 在Java中,初始化对象主要通过构造方法、静态工厂方法或初始化块实现。以下是常见的几种方式: 使用new关键字调用构造方法 通过new关键字调用类的构造方法创建对象实例: Cl…

java类如何创建对象

java类如何创建对象

创建Java对象的方法 在Java中,创建对象主要通过new关键字调用类的构造方法实现。以下是几种常见的方式: 使用new关键字 ClassName objectName = new ClassN…

java如何判断两个对象相等

java如何判断两个对象相等

判断对象相等的核心方法 在Java中判断两个对象是否相等,主要涉及equals()方法和hashCode()方法的正确实现。默认情况下,Object类的equals()比较的是对象的内存地址,但实际开…

java如何实例化对象

java如何实例化对象

实例化对象的基本语法 在Java中,实例化对象是通过new关键字调用构造函数完成的。基本语法如下: ClassName objectName = new ClassName(); 其中ClassNa…