数据描述符和存取描述符的根本区别在于:一个管“值怎么存”,一个管“值怎么拿和设”;数据描述符用value/writable定义静态值及可写性,存取描述符用get/set函数拦截读写实现逻辑封装,二者不可共存且均支持enumerable和configurable配置。

数据描述符和存取描述符的根本区别在于:一个管“值怎么存”,一个管“值怎么拿和设”。它们不能共存于同一个属性,选哪个,决定了这个属性是直接存数据,还是通过函数逻辑来控制读写。
数据描述符:直接绑定值,控制可写性
它用 value 和 writable 定义一个“静态值”及其修改权限:
-
value 是属性的实际值,可以是任意类型(数字、对象、函数等),默认为
undefined - writable: false 时,哪怕属性存在,赋值操作也会静默失败(非严格模式)或报错(严格模式)
- 适合定义常量、只读字段或初始化后不允许变更的配置项
存取描述符:用函数拦截读写,实现逻辑封装
它用 get 和 set 函数接管访问和赋值行为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
get() 在读取属性时执行,
this指向当前对象,无参数,返回值即为属性值 - set(value) 在给属性赋值时触发,接收新值作为唯一参数,可用于校验、转换、同步副作用等
- 适合封装计算属性、私有字段代理、响应式依赖追踪(如 Vue 2 的 data 响应原理)
二者共有的关键开关
无论哪种描述符,都支持两个通用配置项,它们独立于值或函数本身:
-
enumerable: false → 属性不会出现在
for...in、Object.keys()或 JSON 序列化中 -
configurable: false → 描述符不可再改,属性也不能被
delete;一旦设为false,就不可逆
不能混用,否则会报错
JavaScript 强制要求一个属性只能属于其中一类。如果在描述符里同时写了 value 和 get,或者 writable 和 set,Object.defineProperty() 会直接抛出 TypeError。这是设计上的硬性约束,不是建议。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










