javascript:冻结对象

news/2024/9/29 18:25:19 标签: javascript, 开发语言, ecmascript

1 作用

冻结一个对象,使对象不可扩展。

2 特性

  • 对象的属性不可再被新增、删除
  • 对象的属性的值不可再被修改
  • 对象的属性的描述符中任意配置项都不可被重新定义

3 代码示例

3.1 冻结对象

Object.freeze()

代码如下:

'use strict'
let initialData = {a: 123};

initialData.a = 234;
console.log(initialData.a);

Object.freeze(initialData);

/**
 * 严格模式下会报错
 * TypeError: Cannot assign to read only property 'a' of object '#<Object>'
 */
initialData.a = 345;
console.log(initialData.a);

3.2 冻结判断

Object.isFrozen()

代码如下:

//	Object.isFrozen()
Object.isFrozen(initialData);	// true

4 深冻结和浅冻结

直接使用的话只能实现浅冻结,只能冻结第一层。

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>JavaScript - 冻结对象</title>
	</head>
	<body>    
		<script>      
			// 定义一个对象      
			const info = {        
				name: '梦缘',        
				age: 29,        
				hobby: [ '徒步' ]      
			};
      		// 冻结对象      
      		Object.freeze(info);
      		// 新增一个属性:不生效      
      		info.nickname = '熊二';
      		// 删除一个属性:不生效      
      		delete info.name;            
      		// 更改name属性的值:不生效      
      		info.name = '梦念兮';
      		// 更改age属性的值:不生效      
      		info.age = 17;
      		// 更改hobby属性的值:不生效      
      		info.hobby = [ '音乐' ];
      		// 对hobby属性的值添加元素:生效      
      		info.hobby.push('电影');
      		// 打印对象      
      		console.log(info);
      		// 打印对象的每一个属性的描述符      
      		Object.keys(info).forEach(key => {        
      			console.log(Object.getOwnPropertyDescriptor(info, key))      
      		});
      		// 更新属性的【值】描述符:报错      
      		Object.defineProperty(info, 'hobby', {        
      			value: [ '徒步' ]      
      		});
      		// 更新属性的【值是否可更新】描述符:报错      
      		Object.defineProperty(info, 'hobby', {        
      			writable: true      
      		});
      		// 更新属性的【是否可枚举】描述符:报错     
      		Object.defineProperty(info, 'hobby', {        
      			enumerable: false      
      		});
      		// 更新属性的【是否可更改描述符】描述符:报错      
      		Object.defineProperty(info, 'hobby', {        
      			configurable: true      
      		});    
		</script>  
	</body>
</html>

效果如下:

其中的hobby属性还是可以进行push。

深冻结需要更深层次操作:

代码如下:

function deepFreeze(obj) {
  // 首先冻结对象本身
  Object.freeze(obj);

  // 获取对象的所有属性
  const props = Object.getOwnPropertyNames(obj);

  // 递归地冻结属性值为对象的属性
  for (const prop of props) {
    const value = obj[prop];
    if (value && typeof value === 'object') {
      deepFreeze(value);
    }
  }

  return obj;
}

// 示例对象
const obj = {
  a: 1,
  b: {
    c: 2,
    d: [3, 4, 5]
  }
};

// 冻结对象
const frozenObj = deepFreeze(obj);

// 尝试修改对象
frozenObj.a = 10;            // 不可修改
frozenObj.b.c = 20;          // 不可修改
frozenObj.b.d.push(6);       // 不可修改

console.log(frozenObj);  // 输出:{a: 1, b: {c: 2, d: [3, 4, 5]}}

5 注意

冻结只会冻结已有的属性,不会拦截到后续添加的属性。如果需要完全禁止属性的添加和删除,可以通过使用Object.seal()函数进行浅冻结,或者使用Object.preventExtensions()函数来禁止对象扩展。


http://www.niftyadmin.cn/n/5683516.html

相关文章

华为OD机试 - 对称美学(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

js中防抖 debounce 节流 throttle 原理 从0手动实现

1 防抖 高频触发事件时&#xff0c;执行损耗高的操作&#xff0c;连续触发过程中&#xff0c;只执行最后一次。 高频事件&#xff1a;input scroll resize等。损耗高&#xff1a;网络请求、dom操作。 实现防抖步骤&#xff1a;1.在回调函数中判断timer是否存在&#xff0c;存在…

docker kibana 连接es

server.name: kibana server.host: “0” #容器中配置&#xff0c;去掉http://127.0.0.1:9200 elasticsearch.hosts: [“http://host.docker.internal:9200”] #设置访问用户 elasticsearch.username: “elastic” #设置访问密码 elasticsearch.password: “elastic” #设置中文…

TCP编程:从入门到实践

目录 一、引言 二、TCP协议原理 1.面向连接 2.可靠传输 三、TCP编程实践 1.TCP服务器 2.TCP客户端 四、总结 本文将带你了解TCP编程的基本原理&#xff0c;并通过实战案例&#xff0c;教你如何在网络编程中运用TCP协议。掌握TCP编程&#xff0c;为构建稳定、高效的网络通信…

服务器使用frp做内网穿透详细教程,请码住

目录 1.内网穿透的定义 2.前提条件 3.frp下载地址 4.配置服务器端的frps.toml文件 5. 配置客户端&#xff0c;即物理服务器或者是电脑本机地址 6.添加服务端启动命令startServerFrp.sh 7.添加客户端启动命令startClientFrp.sh 8. 查看服务端启动日志 9.查看客户端启…

【算法】反向传播算法

David Rumelhart 是人工智能领域的先驱之一&#xff0c;他与 James McClelland 等人在1986年通过其著作《Parallel Distributed Processing: Explorations in the Microstructure of Cognition》详细介绍了反向传播算法&#xff08;Backpropagation&#xff09;&#xff0c;这一…

哈希表(HashMap、HashSet)

文章目录 一、 什么是哈希表二、 哈希冲突2.1 为什么会出现冲突2.2 如何避免出现冲突2.3 出现冲突如何解决 三、模拟实现哈希桶/开散列&#xff08;整型数据&#xff09;3.1 结构3.2 插入元素3.3 获取元素 四、模拟实现哈希桶/开散列&#xff08;泛型&#xff09;4.1 结构4.2 插…

python绘制动态残差图,plot交互模式

python绘制动态残差图 动态刷新数据&#xff0c;交互模式 # 开启交互模式plt.ion()# 创建初始数据x_line [0, 1]err_wage [0, 10]# 创建图形和轴fig, ax plt.subplots()line, ax.plot(x_line, err_wage, b-) # b-表示蓝色实线# ax.set_xlim(0, 20) # 设置x轴的范围# ax.…