在 javascript 中,可通过 object.defineproperty() 设置 enumerable: false 且 configurable: true 来定义不可枚举但可配置的属性,使其不参与 for...in、object.keys() 等枚举操作,但仍可访问、修改描述符或删除。

在 JavaScript 中,使用 Object.defineProperty() 可以定义不可枚举但可配置的属性。关键在于将 enumerable 设为 false,同时保持 configurable 为 true。
设置 enumerable: false 且 configurable: true
这是最直接的方式。通过 Object.defineProperty() 显式指定属性描述符:
-
enumerable: false—— 属性不会出现在for...in循环、Object.keys()、JSON.stringify()等枚举操作中 -
configurable: true—— 后续仍可修改该属性的描述符(如改为可枚举),也可用delete删除它
示例:
const obj = {};
Object.defineProperty(obj, 'hiddenProp', {
value: 'secret',
writable: true,
enumerable: false,
configurable: true
});
console.log(obj.hiddenProp); // 'secret'
console.log(Object.keys(obj)); // [](不出现)
console.log('hiddenProp' in obj); // true(仍可访问)
delete obj.hiddenProp; // ✅ 成功删除(因为 configurable: true)
注意 writable 和 configurable 的关系
configurable: false 会锁定属性描述符,但 configurable: true 并不限制 writable 的初始值。你可以自由组合:
- 若设
writable: false,则值不可改,但只要configurable: true,仍可调用defineProperty改为writable: true或修改enumerable - 一旦
configurable变为false,就再也不能变回true,也不能删除该属性
避免误用 Object.assign 或字面量语法
对象字面量或 Object.assign() 创建的属性默认是 enumerable: true 且 configurable: true,无法直接创建不可枚举属性:
-
const obj = { hiddenProp: 'x' }→ 该属性始终可枚举 -
Object.assign(obj, { hiddenProp: 'y' })→ 同样生成可枚举属性 - 必须用
defineProperty(或defineProperties)才能精确控制enumerable和configurable
批量定义多个不可枚举可配置属性
可用 Object.defineProperties() 一次性设置多个属性:
const obj = {};
Object.defineProperties(obj, {
_id: { value: 1, writable: true, enumerable: false, configurable: true },
_name: { value: 'test', writable: false, enumerable: false, configurable: true }
});
不复杂但容易忽略:不可枚举 ≠ 不可访问,只是“不参与遍历”。只要知道属性名,依然能读写(除非同时设 writable: false 或 get/set 控制)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











