09-属性描述符Object.getOwnPropertyDescriptor(),原始数据不可重写

news2024/12/28 3:15:37

把原始数据作为属性值传入新对象中,发生原始数据修改丢失的问题怎么办?

  • 应该使用Object.defineProperty()设置该属性
  • 用Object.defineProperty()设置的属性,默认writable、enumerable、configurable均为false
  • 并且自定义提醒该属性设置了不可重写
let obj = {
	a: 1
};

for (const key in obj) {
	console.log(key);
}

let keys = Object.keys(obj);
console.log(keys);

let desc = Object.getOwnPropertyDescriptor(obj, 'a');
console.log(desc);

描述a:

值为1,可重写,可遍历

得到属性描述符

Object.getOwnPropertyDescriptor(obj, 'a');

重设属性描述符

Object.defineProperty(obj, 'a', { })

value: 23, //内容

writable: false, //不可重写

enumerable: false, //不可遍历

configurable: false //属性描述符本身可不可以重复修改

// 重新设置属性描述符
Object.defineProperty(obj, 'a', {
	value: 23,
	writable: false, //不可重写
	enumerable: false, //不可遍历
	configurable: false //属性描述符本身可不可以重复修改
}) 
/* 以下是无效的修改,因为上面的configurable: false */
Object.defineProperty(obj, 'a', {
	value: 23,
	writable: false, //不可重写
}) 
obj.a = 10;
console.log(obj.a);

getter读取器

读取属性值

setter设置器

属性值重新赋值,有一个形参

合称访问器

设置了get和set函数后,将来读取这个属性时,他不会去内存中找,而是运行get函数

get函数里是什么,属性值输出就是什么

Object.defineProperty()定义的属性,属性值被修改时实际上在执行什么代码?

let obj = {};

Object.defineProperty(obj, 'a', {
	get: function () {
		console.log('hello');
		return 2
	},
	set: function (val) {
		console.log('你好');
	}
})
// obj.a = 10;
obj.a = 3 - 2; // set(3-2)
console.log(obj.a); // console.log(get())

输出结果:你好  hello  2

这里定义了一个空对象,用 defineProperty 定义了一个属性 a

obj.a = 3 - 2; 这句话意思是在重新赋值,所以属性值改变的时候,是调用set函数

console.log(obj.a); 得到属性 a 的值,其实就是读取属性值,调用get函数

利用set函数限定原始数据的属性不可重写

let obj = {
	pic: './assets/g1.png',
	title: '椰云拿铁',
	desc: `1人份【年度重磅,一口吞云】`,
	choose: 0,
	sellNumber: 200,
	favorRate: 95,
	price: 32,
}

class UIGoods {
	constructor(g) {
		// this.data = g;
		Object.defineProperty(this, 'data', {
			get: function () {
				return g;
			},
			set: function () {
				throw new Error('data属性时是只读的,不能赋值和修改!')
			},
			configurable: false,
		})
	}
}

const g = new UIGoods(obj);
g.data = 'ab';
console.log(g.data);

利用set函数限定数值类型的属性,设置中间变量,判断它的值和类型

let internalChooseValue = 0;
Object.defineProperty(this, 'choose', {
	get: function () {
		return internalChooseValue;
	},
	set: function (val) {
		if (typeof val !== 'number') {
			throw new Error(`choose属性必须是数字!`);
		}
		let temp = parseInt(val);
		if (temp !== val) {
			throw new Error(`choose属性必须是整数!`);
		}
		if(val < 0) {
			throw new Error(`choose属性必须大于等于0!`);
		}
		internalChooseValue = val;
	},
	configurable: false
})

利用get函数限定总价

Object.defineProperty(this, 'totalPrice', {
	get: function () {
		return this.choose * this.data.price;
	}
})

er6语法糖简写,和constructor同级

get totalPrice () {
	return this.choose * this.data.price;
}

利用get函数限定设置isChoose

get isChoose () {
	return this.choose > 0;
}

Object.freeze()冻结原始数据的克隆版,让它的属性值也不能修改

尽量不要直接修改原始数据

 避免新加属性进去 Object.freeze(this);

 在最后冻结自己,可以防止新加属性改变数据,但是其他普通属性就不能改了

 要使其他普通属性可修改,将freeze换成seal

这样使其他普通属性可修改,原始数据不可修改

限制不能在原型上添加属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710251.html

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

相关文章

掌握Python的X篇_6_常量与变量、常见运算符、字符型变量

文章目录 1. 常量与变量1.1 常量与变量定义1.2 数字型变量 2. 常见运算符3. 字符型变量( 字符 )3.1 字符串变量的格式化 1. 常量与变量 简单理解&#xff0c;直接使用的数据&#xff0c;就是常量&#xff0c;最常见的常量有数字和字符串 采用ipython进行交互式编程 1.1 常量…

5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

5.1阻塞和非阻塞、同步和异步 典型的一次IO的两个阶段是什么&#xff1f;数据就绪和数据读写 数据就绪&#xff1a;根据IO操作的就绪状态 阻塞非阻塞 数据读写&#xff1a;根据应用程序和内核的交互方式 同步异步 陈硕&#xff1a;在处理IO的时候&#xff0c;阻塞和非阻塞都…

FPGA时序约束--实战篇(时序收敛优化)

目录 一、模块运行时钟频率 二、HDL代码 1、HDL代码风格 2、HDL代码逻辑优化 三、组合逻辑层数 1、插入寄存器 2、逻辑展平设计 3、防止变量被优化 四、高扇出 1、使用max_fanout 2、复位信号高扇出 五、资源消耗 1、优化代码逻辑&#xff0c;减少资源消耗。 2、…

基于图层自动识别算法在CAD图纸基础上快速创建Revit BIM模型 - VS2022 + AutoCAD2024 + ObjectARX环境搭建

引言 CAD 技术将建筑师、工程师们从手工绘图推向计算机辅助制图&#xff0c;实现了工程设计领域的第一次信息革命。从 CAD 技术普及以来&#xff0c;设计成果一般都是 CAD 图纸形式表达。但是近些年来&#xff0c;随着建筑的复杂程度日益增加&#xff0c;专业间的配合更加紧密…

行业观察 | 芯片设计产业链:上游至下游

本文简单总结、介绍芯片设计产业链全流程。 更新&#xff1a;2023 / 7 / 2 文章目录 集成电路产业链常见的芯片架构图数字IC设计流程概略版详解版前后端前端&#xff1a;RTL -> Netlist后端&#xff1a;Netlist -> Layout 示例&#xff1a;基于标准单元&#xff08;STD …

通过串口控制LED-单片机

1.输入数据控制LED灯状态00-ff。同时会接收输入的数据。 中断和定时器配置 void UART_Init() //4800bps11.0592MHz { SCON0X50;//sm00,sm11,ren1 PCON & 0x7F; //波特率不倍速 TMOD & 0x0F; //设置定时器模式 T1 TMOD | 0x20; …

【人工智能与机器学习】决策树ID3及其python实现

文章目录 1 决策树算法1.1 特征选择1.2 熵&#xff08;entropy&#xff09;1.3 信息增益 2 ID3算法的python实现总结 1 决策树算法 决策树&#xff08;Decision Tree)是一类常见的机器学习方法&#xff0c;是一种非常常用的分类方法&#xff0c;它是一种监督学习。常见的决策树…

ModaHub魔搭社区:向量数据库MIlvus服务端配置(一)

目录 服务端配置 配置概述 Milvus 文件结构 配置修改 编辑配置文件 运行时修改 server_config.yaml 参数说明 cluster 区域 general 区域 network 区域 服务端配置 配置概述 以下配置说明可同时应用于单机或者分布式场景。 Milvus 文件结构 成功启动 Milvus 服务后…

加速优化WooCommerce跨境电商网站的15种简单方法

Neil Patel和 Google所做的研究表明&#xff0c;如果加载时间超过三秒&#xff0c;将近一半的用户会离开网站。页面加载时间每增加一秒&#xff08;最多5秒&#xff09;&#xff0c;您的收入可能就会减少。在本教程中&#xff0c;我们将学习如何优化加速WooCommerce商店。 目录…

【20220605】文献翻译:高维数据动态可视化研究综述

A Review of the State-of-the-Art on Tours for Dynamic Visualization of High-dimensional Data Visualization of High-dimensional Data) Lee, Stuart, et al. “A Review of the State-of-the-Art on Tours for Dynamic Visualization of High-dimensional Data.” arXiv…

【书评】一本Android系统性能优化的新书

Android性能优化&#xff0c;是一个合格的Android程序员必备的技能&#xff0c;现如今几乎所有的Android面试内容都会或多或少涉及性能优化方面的话题。 学习Android性能优化可以让我们在简历上展示自己的专业技能和项目经验&#xff0c;证明自己具备高效开发和优化Android应用…

java jwt生成token并在网关设置全局过滤器进行token的校验

1、首先引入jjwt的依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>2、编写生成token的工具类 package com.jjw.result.util;import com.jjw.res…

【UnityDOTS 三】Component的理解

Component的理解 文章目录 Component的理解前言一、托管Component与非托管Component1.非托管Component2.托管Component 二、各功能的Component三、在Editor中的Component的区分总结 前言 Component作为ECS中承载数据的结构&#xff0c;了解他相关内容是非常必要的&#xff0c;…

基于Jsp+Servlet+Mysql学生信息管理系统

基于JspServletMysql学生信息管理系统 一、系统介绍二、功能展示1. 系统的部署2.导入数据库3. 系统介绍 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java web项目/Java EE项目/ 项目名称&#xff1a;基于sevelet的学生信息管理系统 当前版本&…

用Python制作一个简单时间、日期显示工具

Python是一款强大的编程软件&#xff0c;可以轻松实现我们的多种开发需求。今天我们拿Python中自带的tkinter来开发一个时钟显示器。如下图所示&#xff1a; 时间显示器 一、编程要求 用tkinter写一个漂亮、五彩的时间显示器&#xff0c;要求显示时、分、秒&#xff0c;即时变…

【JAVA】十分钟带你了解java的前世今生

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【初始JAVA】 文章目录 前言JAVA介绍诞生&#x1f52c;名字与图标&#x1f916;发展&#x1f6e9;️未来&#x1fa84; 前言 玩过我的世界的朋友想必对JAVA以及它的图标都很熟悉&#xff0c;在游戏开始画面…

Java程序所在机器性能监控

Java程序所在机器性能监控 背景 问题单&#xff1a;程序故障&#xff08;OOM、网络不通、操作卡顿&#xff09;问题单&#xff1a;服务连接不上需求 1、监控本地机器性能 告警日志UI2、监控服务接口服务 告警日志UI方案 固定间隔获取机器网络CPU内存数据设置阈值&#xff0c;告…

自定义starter实现接口或方法限流功能

本文的思路是利用AOP技术自定义注解实现对特定的方法或接口进行限流。目前通过查阅相关资料&#xff0c;整理出三种类型限流方法&#xff0c;分别为基于guava限流实现、基于sentinel限流实现、基于Semaphore的实现。 一、限流常用的算法 1.1令牌桶算法 令牌桶算法是目前应用…

OpenCV(视频加载与摄像头使用)

目录 1、VideoCapture类 2、视频属性get() 3、视屏文件保存 1、VideoCapture类 2、视频属性get() 3、视屏文件保存 //视频的读取保存 int test3() {VideoCapture video;//video.open("F:/testMap/lolTFT.mp4");//读取视频video.open(0);//读取摄像头if (!video.i…

linux docker安装

一、Linux安装docker 1.1 前提 要求Linux内核&#xff08;kernel&#xff09; 版本大于等于3.8。&#xff08;kernel version >3.8&#xff09;。 查看当前系统内核版本 uname -a | awk {split($3,arr,"-");print arr[1]} 1.2 linux 安装docker Centos安装doc…