json.stringify()仅序列化自有、可枚举的字符串键属性,因此将属性enumerable设为false可自动排除其序列化;可通过object.defineproperty()或defineproperties()设置,适用于隐藏内部状态等场景。

在 JavaScript 中,enumerable 属性描述符控制一个属性是否会在 for...in 循环或 Object.keys() 等枚举操作中出现。利用它可自然“过滤”不需要序列化的属性——因为 JSON.stringify() 本身**只处理自有、可枚举(enumerable: true)的字符串键属性**,对不可枚举属性、Symbol 键、函数、undefined 等直接忽略。
让属性不可枚举,自动跳过序列化
通过 Object.defineProperty() 或 Object.defineProperties() 将属性的 enumerable 设为 false,它就不会出现在 Object.keys()、for...in 中,也不会被 JSON.stringify() 序列化:
const obj = { name: 'Alice', age: 30 };
Object.defineProperty(obj, 'id', {
value: 123,
enumerable: false, // ? 关键:设为 false
writable: true,
configurable: true
});
console.log(Object.keys(obj)); // ['name', 'age']
console.log(JSON.stringify(obj)); // {"name":"Alice","age":30} —— id 被自动排除
批量定义不可枚举的私有/临时字段
适合添加内部状态、缓存、元数据等不希望暴露给 JSON 的字段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Object.defineProperties()一次性设置多个不可枚举属性 - 避免使用下划线命名约定(如
_temp),改用真正的不可枚举性,更可靠 - 注意:类实例中的实例属性默认是可枚举的;若需隐藏,需显式定义
与 class 配合:在 constructor 中定义不可枚举字段
ES6 class 默认无法直接在字段声明中设 enumerable: false,但可在 constructor 中用 defineProperty 补救:
class User {
constructor(name) {
this.name = name; // 可枚举,会进 JSON
Object.defineProperty(this, 'createdAt', {
value: new Date(),
enumerable: false // ✅ 不会出现在 JSON 中
});
}
}
const u = new User('Bob');
console.log(JSON.stringify(u)); // {"name":"Bob"}
注意边界情况:JSON.stringify 的实际行为
JSON.stringify() 并不真正“读取” enumerable 标志,而是按规范只遍历自有、可枚举的字符串键。因此以下情况均不会被序列化:
- 不可枚举属性(
enumerable: false) - Symbol 类型的键(即使可枚举)
- 值为
undefined、function、symbol的属性 - 原型链上的属性(无论是否可枚举)
所以,设置 enumerable: false 是最轻量、标准且无需额外工具的过滤方式,比手动删键或写白名单更健壮。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










