本质差异在于属性值的存储与访问机制不同:数据描述符直接持有值,存取描述符把读写行为委托给函数;二者互斥,混用会抛出TypeError。

本质差异在于属性值的存储与访问机制不同:数据描述符直接持有值,存取描述符把读写行为委托给函数。
值的存在方式不同
数据描述符的 value 是一个静态存在的具体值(如数字、字符串、对象等),它真实地“驻留”在属性上;而存取描述符本身不保存值,get 和 set 只是拦截访问和赋值动作的钩子函数,实际值通常藏在私有变量(如 _x)或其它位置。
可写性控制逻辑不同
数据描述符靠 writable 控制是否允许用 = 赋值;存取描述符没有 writable,它的“可写”由是否定义了 set 函数决定——没写 set 就是只读,写了才能赋值,且赋值逻辑完全由你自定义。
二者互斥,不能共存
一个属性描述符对象里,一旦出现 value 或 writable,就不能再有 get 或 set;反之亦然。JavaScript 引擎会严格校验,混用会抛出 TypeError。例如:
立即学习“Java免费学习笔记(深入)”;
-
{ value: 10, get() { return 20; } }→ 报错 -
{ writable: false, set(v) { this._v = v; } }→ 报错
默认行为与常见用途差异
普通对象字面量创建的属性,默认都是数据描述符(configurable 和 enumerable 为 true,writable 为 true,value 为所赋的值)。而存取描述符常用于需要计算、验证、副作用或封装的场景,比如:
- 属性值依赖其他属性(
fullName基于firstName和lastName) - 赋值前做类型检查或格式化(如限制
age必须是正整数) - 触发事件或更新视图(响应式系统的基础)


















