object.keys只返回对象自身可枚举的字符串属性名:不包括不可枚举属性、symbol属性及原型链属性;适用于实例对象,不适用于类、函数或原型。

Object.keys 只能获取对象**自身、可枚举、非 Symbol** 的属性名(字符串数组),它**不会遍历原型链**,所以天然适用于获取实例的自有可枚举属性——但要注意:它不包括不可枚举属性、Symbol 属性,也不包括继承来的属性。
确认你操作的是“实例对象”,不是构造函数或原型
常见误区是传入了类、函数或原型对象。Object.keys 接收的必须是具体的实例(即通过 new 创建的对象):
class Person {
constructor(name, age) {
this.name = name; // ✅ 自有可枚举
this.age = age; // ✅ 自有可枚举
}
say() {} // ❌ 是原型方法,Object.keys 不会返回 'say'
}
<p>const p = new Person('Alice', 30);
console.log(Object.keys(p)); // ['name', 'age'] —— 正确:只返回实例自身的可枚举属性
</p>注意不可枚举属性会被自动忽略
即使属性在实例上,只要被设为不可枚举,Object.keys 就不会返回它:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Object.defineProperty显式设置enumerable: false - 某些内置属性(如
arguments.callee)默认不可枚举 - 使用
Object.preventExtensions或Object.seal不影响枚举性,但Object.freeze也不改变已有的enumerable值
const obj = {};
Object.defineProperty(obj, 'hidden', {
value: 42,
enumerable: false
});
obj.visible = 'yes';
<p>console.log(Object.keys(obj)); // ['visible'] —— 'hidden' 被跳过
</p>如果需要更完整的自有属性列表(含不可枚举/Symbol)
Object.keys 功能有限,按需换用其他 API:
- 所有自有属性名(含不可枚举):
Object.getOwnPropertyNames(obj) - 所有自有 Symbol 属性:
Object.getOwnPropertySymbols(obj) - 所有自有属性(字符串 + Symbol,含不可枚举):
Reflect.ownKeys(obj)
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
obj[Symbol('c')] = 3;
<p>console.log(Object.keys(obj)); // ['a']
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b']
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(c)]
console.log(Reflect.ownKeys(obj)); // ['a', 'b', Symbol(c)]
</p>与 for...in 的关键区别
不要混淆 Object.keys 和 for...in:
-
Object.keys():只返回实例自身可枚举属性(字符串键) -
for...in:遍历**自身 + 原型链上所有可枚举属性**(字符串键),需配合hasOwnProperty过滤
const parent = { x: 'from parent' };
const child = { y: 'from child' };
Object.setPrototypeOf(child, parent);
<p>console.log(Object.keys(child)); // ['y']
for (let key in child) {
console.log(key); // 'y', 'x' —— 包含原型上的 x
}
</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










