JavaScript 中 writable 属性于对象字面量中是如何默认配置的

作者:袖梨 2026-07-08
对象字面量属性的writable默认为true,即属性值可被直接修改;而Object.defineProperty默认writable为false,需显式设置才可写。

在对象字面量中创建的属性,writable 默认为 true,这意味着属性值可以直接被赋值修改。

对象字面量属性的 writable 行为

当你用 { key: value } 方式声明对象时,JavaScript 自动为每个属性设置完整的数据描述符,且三个关键布尔特性都默认开启:

  • writable: true — 允许后续通过 obj.key = newValue 修改值
  • enumerable: true — 属性会出现在 for...inObject.keys()
  • configurable: true — 允许删除该属性,或用 Object.defineProperty 重新配置其描述符

与 defineProperty 的关键区别

这种默认行为和 Object.defineProperty 完全不同:后者在只传 value 时不显式指定其他特性,writable、enumerable、configurable 全部默认为 false

  • 字面量:const obj = { x: 1 };x 可写、可枚举、可配置
  • defineProperty:Object.defineProperty(obj, 'y', { value: 2 });y 不可写、不可枚举、不可配置(除非手动设为 true)

验证 writable 状态的方法

可以用 Object.getOwnPropertyDescriptor 查看实际描述符:

立即学习“Java免费学习笔记(深入)”;

const obj = { a: 42 };console.log(Object.getOwnPropertyDescriptor(obj, 'a'));// 输出:{ value: 42, writable: true, enumerable: true, configurable: true }

注意:这个状态无法通过点号或方括号语法反向修改;想改 writable,必须再次调用 Object.defineProperty,且前提是 configurable 仍为 true。

设为 false 后的实际表现

一旦 writable: false,赋值操作的效果取决于执行环境:

  • 非严格模式下:obj.a = 99 静默失败,obj.a 保持原值
  • 严格模式下:"use strict"; obj.a = 99 立即抛出 TypeError

这和 const 声明变量不同——const obj = {...} 锁的是变量绑定,不影响对象内部属性的可写性。

相关文章

精彩推荐