javascript:冻结对象

news2024/9/29 17:52:17

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.coloradmin.cn/o/2177468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#案例 | 基于C#语言在Excel中进行二次开发(一):简单系统搭建:打印输出“Hello Excel C#”

基于C#语言在Excel中进行二次开发&#xff08;一&#xff09;&#xff1a;简单系统搭建&#xff1a;打印输出”Hello Excel & C#” 实现效果第一步&#xff1a;前期准备第二步&#xff1a;打开VS 2022&#xff0c;创建项目第三步&#xff1a;程序界面设计 实现效果 在Exce…

【大模型】通俗解读变分自编码器VAE

目录 写在前面 一、VAE结构 二、损失函数 三、代码实现 1.训练代码 2.推理生成图片 3.插值编辑图片 四、总结 写在前面 论文地址&#xff1a;https://arxiv.org/abs/1312.6114 大模型已经有了突破性的进展&#xff0c;图文的生成质量都越来越高&#xff0c;可控性也越来…

cesium渲染的3Dtiles的模型下载!glb模型文件下载!

前端开发测试或者学习cesium的时候最难最麻烦就是找到一个合适的模型&#xff0c;现在就直接给各位放几个可以满足我们测试使用的模型文件。 模型文件下载—香港3DTiles模型文件 某盘 通过百度网盘分享的文件&#xff1a;hk-效果图.png&#xff0c;hk.zip等2个文件 链接&…

react中的ref三种形式

1&#xff0c;字符串形式 <!-- 创建盒子 --><div id"test"></div> <script type"text/babel">class Demo extends React.Component{render(){return(<div><input type"text" refinput1 /><button onCl…

奔驰EQS450suv升级增强AR抬头显示HUD案例分享

以下是奔驰 EQS450 SUV 升级增强版 AR 抬头显示的一般改装案例步骤及相关信息&#xff1a; 配件&#xff1a;通常包括显示屏、仪表模块、饰板等。 安装步骤&#xff1a; 1. 拆下中控的仪表。 2. 在仪表上预留位置切割出合适的孔位&#xff0c;用于安装显示器。 3. 将显示器…

宝塔部署若依前端出现502解决方法

一、前言 ‌若依系统是一个基于Java语言的开源项目&#xff0c;旨在帮助开发者减少开发时间&#xff0c;特别适用于需要快速开发出一套具有用户管理、菜单管理、权限管理、定时任务、日志管理等功能的简单系统。‌ 系统分为前后端分离、分布式等架构 部署教程如下&#xff1a…

单体到微服务架构服务演化过程

架构服务化 聊聊从单体到微服务架构服务演化过程 单体分层架构 在 Web 应用程序发展的早期&#xff0c;大部分工程是将所有的服务端功能模块打包到单个巨石型&#xff08;Monolith&#xff09;应用中&#xff0c;譬如很多企业的 Java 应用程序打包为 war 包&#xff0c;最终会形…

软文代发高效率推广方式解析-华媒舍

在这个时代&#xff0c;软文代发成为了一种非常实用的推广方法。如何有效地开展软文代发营销推广&#xff0c;并不是每个人都知道的。下面我们就以高效软文代发推广方式大曝光为主线&#xff0c;为书友详细介绍科谱有关的内容。 一、什么叫软文代发 软文代发是指由企业或个人必…

引入 LangChain4j 来简化 LLM 与 Java 应用程序的集成

作者&#xff1a;来自 Elastic David Pilato LangChain4j 框架于 2023 年创建&#xff0c;其目标如下&#xff1a; LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序的过程。 LangChain4j 提供了一种标准方法&#xff1a; 根据给定内容&#xff08;例如文本&#xff09;创…

VSCode编程配置再次总结

VScode 中C++编程再次总结 0.简介 1.配置总结 1.1 launch jsion文件 launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。 左侧任务栏的第四个选项运行和调试,点击创建launch.json {"conf…

AI变现N种方式,新手小白必看!【保姆级教程】

风口&#xff01;风口&#xff01;风口&#xff01; 终于不用再抱怨 “我们这代人啊&#xff0c;什么也没赶上” 因为我们现在正处于风口之上&#xff01; 在当今数字化的时代 AI 绘画正以惊人的速度崛起 并向各行各业渗透 既然阻止不了时代的变化 那就让它为我们所用 …

打造高业绩朋友圈:策略与实践

在数字化时代&#xff0c;朋友圈不仅是个人生活的展示窗口&#xff0c;更是商业变现的有力平台。许多人通过精心经营朋友圈&#xff0c;实现了财富的增长&#xff0c;甚至达到了年入百万的惊人业绩。朋友圈已成为普通人实现逆袭的重要战场。 要打造一个业绩过万的朋友圈&#…

微积分入门(真的很入门)

前置知识 前置知识&#xff1a;极限 我们要求 lim ⁡ x → 1 x 2 − 1 x − 1 \lim\limits_{x \to 1}\dfrac{x^2-1}{x-1} x→1lim​x−1x2−1​。 右边我们都知道是什么意思&#xff0c;那左边是什么呢&#xff1f; 意思就是&#xff0c;当 x x x 无限接近 1 1 1 时&…

Java IO 和 NIO

在 Java 编程中&#xff0c;输入输出&#xff08;IO&#xff09;是不可或缺的部分&#xff0c;随着技术的发展&#xff0c;Java 的 IO 系统也经历了显著的变化。本文将深入探讨 Java IO 和 NIO 的历史、优缺点以及适用场景。 1. Java IO 的历史 Java IO 包&#xff08;java.i…

JVM和GC监控技术

一、监控技术简介 JVM是什么&#xff1f;项目里面有JVM吗&#xff1f;JVM跟Tomcat有什么关系&#xff1f;为什么需要去分析JVM&#xff1f; 1. JVM(全称&#xff1a;Java Virtual Machine)&#xff0c;Java虚拟机 是Java程序运行的环境&#xff0c;它是一个虚构的计算机&…

盛世欢歌,共庆华诞!祝大家国庆节快乐!

举国同庆 盛世中华 盛世欢歌&#xff0c;共庆华诞&#xff01;在这美好的时光里&#xff0c;让我们一起欢庆国庆&#xff0c;感受祖国的强大和美好。数图祝大家国庆快乐&#xff01; 国庆来临之际&#xff0c;根据国家有关规定&#xff0c;现将2024年国庆放假安排通知如下&…

JVM(HotSpot):虚拟机栈(JVM Stacks)与本地方法栈(Native Method Stacks)

文章目录 一、内存结构图二、数据结构-栈三、JVM栈四、本地方法栈五、问题辨析1、垃圾回收是否涉及栈内存&#xff1f;2、栈内存越大越好吗&#xff1f;3、方法内的局部变量是否线程安全&#xff1f;4、栈内存溢出问题 一、内存结构图 二、数据结构-栈 数据结构中&#xff0c;…

windows 系统服务在注册表中的位置

计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services 此注册表项下是系统服务安装信息 利用此注册表项可以获取服务详细信息

新版Android Studio Koala 导入github第三方依赖 maven仓库的处理方法 (java版)

以下是依赖的处理 这是由于Android Studio 构建项目模式发生改变了。 旧版项目构造 创建新的项目采用build.gradle.kts配置。 先看旧版同样的配置是什么样的。 再来查看新版带.kts后缀文件官方自带的库是怎么配置&#xff0c;模拟配置就OK。 先看libs文件这个库的写法。 …

隐藏SpringBoot自动生成的文件

第一种方法——删除 第二种方法——Settings——Editor——fail types