对象字面量属性的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 = {...} 锁的是变量绑定,不影响对象内部属性的可写性。
ubuntu20.04怎么使用蓝牙连接手机互传文件?
ubuntu系统怎么选择最佳服务器?
5Mware虚拟机安装Ubuntu 16.04.5 图文详解
用 Pi Agent 连接 Codex 或 Claude 官方账号有封号风险吗?
Pi Agent 使用 Codex、Claude 或 Gemini OAuth 会导致账号被封吗?
AI Agent 为什么更喜欢命令行?CLI 与 GUI 的真正分工是什么?