js深入理解对象的 属性(properties)的特殊 特性(attributes)

2024-05-27 21:44

本文主要是介绍js深入理解对象的 属性(properties)的特殊 特性(attributes),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对象

   js对象

// 构造一个对象
let obj = {};
let obj = new Object();

        我们知道js中一切皆对象,对象是一个键值对集合(key: value),一个键(key)对应一个值(value),而每个键都是这个对象的属性,我们可以通过对象的属性来获取对应的值,但是对于对象的属性来说,他还有一些“隐式”的特性。

属性标志

对象属性(properties),除 value 外,还有三个特殊的特性(attributes),也就是所谓的“标志”:

  • writable — 如果为 true,则值可以被修改,否则它是只可读的。
  • enumerable — 如果为 true,则会被在循环中列出,否则不会被列出。
  • configurable — 如果为 true,则此属性可以被删除,这些特性也可以被修改,否则不可以。

        当我们用“常用的方式”创建一个属性时,它们都为 true。这表示一个新建的对象,它的属性默认是可修改的,可遍历的,可删除的

Object.getOwnPropertyDescriptor()

         静态方法返回一个对象,该对象描述给定对象上特定属性的一些特性。返回的对象是可变的,但不会影响原来的对象。

let descriptor = Object.getOwnPropertyDescriptor(obj, propertyName);//1.obj---对象。
//2.propertyName---需要从中获取信息的属性的名称。
let obj = {name : "Tom",age : 18
}console.log(obj);let descriptor = Object.getOwnPropertyDescriptor(obj,"name");// 返回一个对象 obj对象的name属性的特性
console.log(descriptor);

 

可以看到obj对象的name属性值是“Tom”,name在obj中是可以遍历的,可以修改的,可以删除的 

这里要注意,descruptor的内容 并不指向这些属性,直接修改descruptor,obj不会有任何影响(obj是一个新对象,只是用来展示,查看)

Object.defineProperty()

Object.defineProperty(obj, prop, descriptor)//1.obj---要定义属性的对象。
//2.prop---一个字符串或 Symbol,指定了要定义或修改的属性(键)。
//3.descriptor---要定义或修改的属性的描述符。

Object.defineProperty() 静态方法会直接在给定的对象上定义一个新属性,或修改其现有属性,并返回此对象。

Object.defineProperty(obj,"sex",{value : "男"
})
console.log(obj,Object.getOwnPropertyDescriptor(obj,"sex"));

 可以看到通过这个方法可以给对象添加属性和值,同时若没有指定其他特性,那默认会设置为false,而直接对属性修改值和添加属性的方式则默认其特性为true。

在这个例子中,obj的sex属性是不能被遍历,修改,和删除的,我们只能读取它的值

总结

了解这些后,我们设置对象时就可以像内建的对象一样,设置常量,而不被修改(例如:Math.PI)

更多相关内容

这篇关于js深入理解对象的 属性(properties)的特殊 特性(attributes)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008675

相关文章

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja