对象字面量属性的writable默认为true,即属性值可被直接修改;而Object.defineProperty默认writable为false,需显式设置才可写。
在对象字面量中创建的属性,writable 默认为 true,这意味着属性值可以直接被赋值修改。
当你用 { key: value } 方式声明对象时,JavaScript 自动为每个属性设置完整的数据描述符,且三个关键布尔特性都默认开启:
obj.key = newValue 修改值for...in 和 Object.keys() 中Object.defineProperty 重新配置其描述符这种默认行为和 Object.defineProperty 完全不同:后者在只传 value 时不显式指定其他特性,writable、enumerable、configurable 全部默认为 false。
const obj = { x: 1 }; → x 可写、可枚举、可配置Object.defineProperty(obj, 'y', { value: 2 }); → y 不可写、不可枚举、不可配置(除非手动设为 true)可以用 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。
一旦 writable: false,赋值操作的效果取决于执行环境:
obj.a = 99 静默失败,obj.a 保持原值"use strict"; obj.a = 99 立即抛出 TypeError
这和 const 声明变量不同——const obj = {...} 锁的是变量绑定,不影响对象内部属性的可写性。