JavaScript对象字面量中writable属性默认配置

作者:技术拾光

时间:2026-07-26

浏览:119

对象字面量中属性描述符默认全部开启,writable为true可直接赋值修改;而Object.defineProperty定义的属性,writable、configurable、enumerable均默认为false,需手动设为true才能修改或枚举。两者默认行为差异显著。

文章目录
在对象字面量中,属性的 `writable` 默认值为 `true`,这意味着可以直接通过赋值修改属性值。但很多人不清楚,当使用 `Object.defineProperty` 定义属性时,情况恰好相反——`writable` 默认是 `false`,必须手动设为 `true` 才能修改。这一差异值得深入探讨。

JavaScript对象字面量中writable属性默认配置

使用 `{ key: value }` 这种最自然的方式声明对象时,JavaScript 会自动为每个属性配齐三个描述符,且全部默认开启: - **writable: true** —— 允许 `obj.key = newValue` 直接修改值 - **enumerable: true** —— 属性会出现在 `for...in` 和 `Object.keys()` 中 - **configurable: true** —— 允许删除该属性,或者用 `Object.defineProperty` 重新配置描述符

对象字面量属性的 writable 行为

这种“全开”的默认行为,与 `Object.defineProperty` 形成鲜明对比。后者如果只传了 `value` 而不显式指定其他特性,那么 `writable`、`enumerable`、`configurable` 全部默认是 `false`。 - 字面量:`const obj = { x: 1 };` → `x` 可写、可枚举、可配置 - defineProperty:`Object.defineProperty(obj, 'y', { value: 2 });` → `y` 不可写、不可枚举、不可配置(除非手动设为 true)

与 defineProperty 的关键区别

要验证某个属性的实际状态,可以用 `Object.getOwnPropertyDescriptor` 来查看:
const obj = { a: 42 };
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
// 输出:{ value: 42, writable: true, enumerable: true, configurable: true }
这里有一个容易忽略的点:无法通过点号或方括号语法直接修改 `writable` 值。要修改,必须再次调用 `Object.defineProperty`,且前提是 `configurable` 仍然为 `true`。

验证 writable 状态的方法

一旦将 `writable` 设为 `false`,赋值操作的效果取决于执行环境: - 非严格模式下:`obj.a = 99` 静默失败,`obj.a` 保持原值 - 严格模式下:`"use strict"; obj.a = 99` 会立即抛出 `TypeError`

设为 false 后的实际表现

最后提醒一点:这与 `const` 声明变量不是一回事。`const obj = {...}` 锁住的是变量绑定,阻止重新为 `obj` 赋值,但对象内部属性的可写性不受影响——该写还是能写,除非主动将 `writable` 设为 `false`。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章