javascript中对只读对象属性解构赋值完全合法,因解构仅为读操作;但若属性不可枚举或getter抛错,则会导致跳过或报错。

JavaScript 中对只读对象属性进行解构赋值,和普通对象完全一样——解构本身不修改源对象,也不关心属性是否只读。只要属性可读(即 enumerable: true 且能被访问),就能正常提取值。
只读属性不影响解构过程
只读性(通过 Object.defineProperty 设置 writable: false)限制的是「给该属性重新赋值」,而解构只是读取属性值并赋给新变量,属于安全的读操作。
- 例如:
const obj = Object.freeze({ name: "Alice" });或Object.defineProperty(obj, "id", { value: 123, writable: false }); - 下面的解构完全合法:
const { name, id } = obj; -
name和id会得到对应值,不会报错,也不会触发任何副作用
需注意的两个实际边界
虽然只读不影响解构,但以下两种情况会导致解构失败或不符合预期:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
属性不可枚举(
enumerable: false):解构只能读取可枚举属性。如果只读属性同时被设为不可枚举(如用defineProperty显式设enumerable: false),则解构时会跳过它,变量得undefined(除非设了默认值) - 属性是 getter 且执行时报错:若只读属性由 getter 实现,而 getter 内部抛出异常(比如依赖未初始化的状态),那么解构时调用 getter 就会报错
常见只读场景的解构示例
以下代码在现代浏览器和 Node.js 中均能正常运行:
const user = {};
Object.defineProperty(user, 'uid', {
value: 'U-789',
writable: false,
enumerable: true,
configurable: false
});
Object.defineProperty(user, 'role', {
get() { return 'admin'; },
enumerable: true
});
// ✅ 正常解构
const { uid, role, status = 'active' } = user;
console.log(uid); // "U-789"
console.log(role); // "admin"
console.log(status);// "active"(默认值生效,因 user 没有 status 属性)
冻结对象(Object.freeze)也能解构
Object.freeze 会让所有自有属性变为只读+不可配置,但默认保持可枚举。因此:
const frozen = Object.freeze({ x: 1, y: 2 });-
const { x, y } = frozen;→ 完全可行 - 即使后续尝试
frozen.x = 99失败,也不影响之前已完成的解构










