对象字面量中属性描述符默认全部开启,writable为true可直接赋值修改;而Object.defineProperty定义的属性,writable、configurable、enumerable均默认为false,需手动设为true才能修改或枚举。两者默认行为差异显著。
JavaScript对象字面量中writable属性默认配置
作者:技术拾光
时间:2026-07-26
浏览:119
文章目录
在对象字面量中,属性的 `writable` 默认值为 `true`,这意味着可以直接通过赋值修改属性值。但很多人不清楚,当使用 `Object.defineProperty` 定义属性时,情况恰好相反——`writable` 默认是 `false`,必须手动设为 `true` 才能修改。这一差异值得深入探讨。

对象字面量属性的 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`。实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。
相关文章