初识: 对象的属性特征

news2025/1/27 13:11:19

1. 前言
2. 什么是对象的属性特征
3. 灵活控制对象的属性特征
4. configurable: false 是单向设置的
 

1. 前言


众所周知,默认情况下我们可以任意对自己定义的对象进行增删改的。但是,在某些情况下,我们不能让别人去随便修改我们定义的对象的属性,那么我们应该怎么处理呢 ?这就需要了解下对象的属性特征了。

 
  1. const user = { name: 'liang', age: 18 }
  2. // 默认情况下,我们可以对定义的对象任意增删改
  3. user.height = 180
  4. delete user.age
  5. user.name = 'yang'

2. 什么是对象的属性特征


获取对象的某个自有属性的属性描述,也就是属性特征

 
  1. // 获取对象的自有属性的属性描述
  2. const feature = Object.getOwnPropertyDescriptor(user, 'name')
  3. // 获取对象所有自有属性的属性描述
  4. const featureAll = Object.getOwnPropertyDescriptors(user)

变量 feature 返回值示例:

 
  1. {
  2. "value":"liang",
  3. "writable":true,
  4. "enumerable":true,
  5. "configurable":true
  6. }

3. 灵活控制对象的属性特征


Object.defineProperty() 方法用于在对象上定义一个新属性或修改一个对象的现有属性

Object.defineProperty(对象, 属性, 属性描述)。属性描述也就是 Object.getOwnPropertyDescriptor 的返回值

 
  1. // user.name 属性不存在就是新增属性操作,存在就是修改属性操作
  2. Object.defineProperty(user, 'name', { value: "zhangsan" })

属性特征之 value:表示该属性对应的值

 
  1. // 将 name 属性值修改为 100
  2. Object.defineProperty(user, 'name', { value: 100 })

属性特征之 writable: 表示能否修改属性值 true 能改 false 不能修改

 
  1. // writable 设置为 false
  2. Object.defineProperty(user, 'name', { writable: false })
  3. // name 不能修改,但是此处修改了
  4. // 在严格模式下会抛出错误
  5. // 虽然在非严格模式不会抛出错误,但也不会修改成功
  6. user.name = 'updated name'

属性特征之 enumerable: 表示是否可以通过 for-in 访问属性, 或通过 Object.keys() 获取

 
  1. // enumerable 表示属性是否会出现在对象的枚举属性中 false 不在对象的枚举属性中
  2. Object.defineProperty(user, 'name', { enumerable: false })

属性特征之 configurable: 表示属性特征是否能被改变,当为 true 时,属性特征才能被改变,同时该属性也能被删除

 
  1. // configurable: false 代表属性特征不能被修改了
  2. Object.defineProperty(user, 'name', { configurable: false })
  3. // 注意: 设置了 configurable: false,可以设置 value 和 writable,但不能修改 enumerable
  4. Object.defineProperty(user, 'name', { value: 120 })
  5. Object.defineProperty(user, 'name', { writable: false })
  6. // 因为上面定义了 configurable: false,所以在修改属性特征会报错
  7. Object.defineProperty(user, 'name', { enumerable: false })
  8. // 因为上面定义了 configurable: false,所以无法删除属性
  9. // 在非严格模式下删除属性不会抛出错误,但在严格模式下删除属性时会抛出错误
  10. delete user.name

补充: 可以使用 Object.defineProperties() 批量定义属性或修改属性特征

 
  1. Object.defineProperties(user, {
  2. name: {
  3. value: "maria",
  4. writable: false,
  5. enumerable: false,
  6. configurable: false
  7. },
  8. age: {
  9. value: 20,
  10. writable: false,
  11. enumerable: false,
  12. configurable: false
  13. }
  14. })

4. configurable: false 是单向设置的


 
  1. // configurable: false 是单向改变的
  2. // 也就是无法再修改为 configurable: true
  3. Object.defineProperty(user, 'name', { configurable: false })
  4. // 抛出错误
  5. Object.defineProperty(user, 'name', { configurable: true })

 

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

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

相关文章

《数据结构》二叉数

学习目录树型结构概念树的重要概念树的表示形式二叉数概念特殊的二叉树二叉树的性质练习题树型结构 概念 树是一种非线性的数据结构,由 n 个有限节点组成一个有层次关系的集合 它具有以下的特点: 有一个特殊的结点,称为根结点,…

【 Threejs 】- Shader 着色器实例渲染教程

着色器在threejs中是一个难点,话不多说,先来看看着色器是什么? 如果您已经有使用计算机绘图的经验,您就会知道在这个过程中您先画一个圆,然后画一个矩形、一条线、一些三角形,直到您组成您想要的图像。这个…

面试真题 | 什么是 Redis ? Redis缓存应用场景有哪些?

面试官问题 redis击穿、穿透有什么区别?如何设计用例及测试 Redis 的基本概念 在没有添加 Redis 的时候,后端的查询流程是: 用户访问页面。请求后端服务。经过逻辑处理后,去数据库查询信息。 在添加 Redis 的之后,…

MySQL 服务端口大全

介绍 MySQL默认服务端口3306/TCP都不会陌生,但MySQL提供服务只有单纯的这个端口吗。在8.0版本默认启动的时候会发现,出现新的端口。 可以说MySQL使用的端口数量取决于所启用的特性、所使用的组件、应用程序连接的方式以及环境的其他方面。 按照官方说…

转速传感器信号隔离变送器正弦波输入方波信号输出

特点 转速传感器信号直接输入,方波信号输出正弦波、锯齿波信号输入,方波信号输出200mV峰值微弱信号的放大与整形不改变原波形频率,响应速度快电源、信号:输入/输出 3000VDC三隔离辅助电源:5V、12V、15V或24V直流单电源…

Huffman编码

目录背景Huffman编码代码部分背景 在数据传输,保存的时候,特别是在数据量特别大的时候传输,保存数据是一件特别麻烦的事。比如逛淘宝的时候,首页会有很多商家展示自己产品的高清图片,如果不对图片进行压缩服务端保存图…

经历百度、美团两次被裁后,我能在小公司躺平吗?

百度裁员后我进入体制内,专心学习自动化 百度被裁后,我意识到自学效果不佳,跟不上职场的所需,于是有了系统学习的想法。 这时的新工作是在体制内,工作强度不大,时间上也比较自由,便正式成为了…

非零基础自学Golang 第12章 接口与类型 12.5 类型断言

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.5 类型断言12.5.1 ok-pattern12.5.2 switch-type第12章 接口与类型 12.5 类型断言 类型断言是使用在接口变量上的操作。 简单来说,接口类型向普通类型的转换就是类型断言。 类型断言的语法是…

【关于时间序列的ML】项目 1 :使用 Python 进行 Covid-19 病例 预测

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

rk3568 | 瑞芯微平台GPIO引脚驱动编写

最近在玩瑞芯微平台的产品,移植了几个设备的驱动,遇到了一些问题,总结后发现大部分问题都出在了GPIO配置的问题上,写下本篇文章,用来分享一下调试的心得。 有喜欢瑞芯微的朋友,可以加我好友,拉…

JVM的作用,结构

源文件经过编译,生成字节码文件 JVM执行字节码文件(实际上就是将字节码解释成具体平台上的机器指令) jdk,jre,jvm三者的关系: jvm的组成: (1)类加载器子系统:负责将.class文件加载到JVM中 (2)…

初学编程,我们应该怎么做,十年老鸟带你入门。

问问自己学编程的真正目的,仅仅是想应付考试考证,还是真心想从事编程方面的工作。仅仅处于功利性而不是真心喜欢,人生苦短,劝不要来浪费时间,找其它真心喜欢的事情。不是社会喜欢的,不是父母喜欢的&#xf…

这6个微信隐藏功能你真的知道吗?学到就是赚到

我们常用的软件——微信,它有着许多隐藏功能,这些功能其实是很好用的,但是一直被我们忽略掉,现在我整理出来了,一起来看看吧。1.登录设备管理 我们平常在其它设备登录,第一次登录需要二次验证才能成功&…

jdk11新特性——新的Epsilon垃圾收集器

目录一、Epsilon垃圾收集器概述二、Epsilon垃圾收集器用法三、Epsilon垃圾收集器代码示例四、使用Epsilon垃圾收集器的原因五、使用Epsilon垃圾收集器的主要用途一、Epsilon垃圾收集器概述 A NoOp Garbage CollectorJDK上对这个特性的描述是: 开发一个处理内存分配但不实现任何…

【Flink】Flink GET operation failed: Server side error 从blobserver下载错误

文章目录 1.概述2.服务器端1.概述 flink 报错 Flink GET operation failed: Server side error 从blobserver下载错误 java.io.IOException: GET operation failed: Server side error: /tmp/hadoop-www/nm-lo

技术栈入门-------Redis

使用redis的准备工作 1、在虚拟机上安装redis(前提是安装了docker容器) 上面使用到的命令 docker pull redis mkdir -p /mydata/redis/confdocker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \ -v /mydata/redis/conf/redis.conf:/et…

Python相关软件下载教程

前言 想要在电脑端运行python程序,需要先下载三个软件:Python解释器,编辑器(使用Visual Studio Code,简称VS Code),python软件包管理系统(简称pip)。 一、MacOS系统安装…

如何使用ArcGIS进行点抽稀(优化版)

概述 有的时候我们手上的数据很密集(比如POI数据),全部加载出来会很挤,在我们只需要部分数据的情况下就需要对其进行抽稀,这里为大家介绍一种比较简单的抽稀方法,希望能对大家有所帮助。 按百分比抽稀 在…

ICG-Hydrazide,用于光热治疗或光动力治疗

ICG能够强烈地吸收光能将其转化为热能或产生单线态氧,可用于光热治疗(PTT)或光动力治疗(PDT)。 英文名称:ICG-Hydrazide 外观:固体/粉末 质量纯度:95% 储存条件:-20℃ 结构式: 凯新生物运输说明: 极低…

Linux学习-87-LNMP一键安装过程

17.16 LNMP安装的前期准备(LNMP一键安装包下载) 手工安装 LNMP 环境,那么同样需要安装大概 10多个源码包(根据版本和功能不同而不同)。不过,现在网上非常流行的 LNMP 环境的搭建过程是采用 LNMP 一键安装包…