object.getownpropertynames()返回对象自身所有可枚举和不可枚举的字符串属性名数组,不包含原型链属性和symbol属性。

Object.getOwnPropertyNames() 用于获取对象**自身所有可枚举和不可枚举的属性名(字符串数组)**,不包括原型链上的属性。
只返回自有属性,不查原型
它只遍历对象自己定义的属性,不会向上查找 __proto__ 或 prototype 链上的属性。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const parent = { a: 1 };
const child = Object.create(parent);
child.b = 2;
Object.defineProperty(child, 'c', { value: 3, enumerable: false });
console.log(Object.getOwnPropertyNames(child)); // ['b', 'c']
// 注意:a 没出现,因为它是继承来的,不是 child 自有属性
包含不可枚举属性
和 Object.keys() 不同,它会把 enumerable: false 的属性也列出来:
const obj = {};
obj.x = 1;
Object.defineProperty(obj, 'y', { value: 2, enumerable: false });
console.log(Object.keys(obj)); // ['x']
console.log(Object.getOwnPropertyNames(obj)); // ['x', 'y']
不返回 symbol 属性
它只返回字符串键名,Symbol 类型的属性名会被忽略。要获取 symbol 属性,得用 Object.getOwnPropertySymbols():
const sym = Symbol('hidden');
const obj = { a: 1 };
obj[sym] = 'secret';
console.log(Object.getOwnPropertyNames(obj)); // ['a']
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(hidden)]
常见用途
- 做属性名的完整快照(比如深拷贝前检查有哪些键)
- 调试时查看对象到底定义了哪些自有属性(含不可枚举的)
- 配合
Object.getOwnPropertyDescriptor()批量读取属性描述符 - 实现浅克隆时确保复制所有自有属性(包括不可枚举的)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










