object.getownpropertynames返回对象所有自有属性名(含不可枚举属性),不包含继承属性;结果为字符串数组,按创建顺序排列,适用于任意对象类型。

Object.getOwnPropertyNames 用于获取对象**所有自有属性的属性名(包括不可枚举的)**,但不包含继承来的属性。它返回一个字符串数组,顺序大致按属性定义顺序(严格来说是按属性创建顺序,对数组索引属性会按数字升序排列)。
基本用法:获取所有自有属性名
直接传入目标对象即可:
const obj = {
a: 1,
b: 2
};
Object.defineProperty(obj, 'c', {
value: 3,
enumerable: false // 不可枚举
});
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b', 'c']
注意:a 和 b 是可枚举的普通属性,c 是手动设置为不可枚举的属性,但仍会被 getOwnPropertyNames 捕获。
和 Object.keys 的区别
关键差异在于是否包含不可枚举属性:
-
Object.keys(obj)只返回**可枚举的自有属性名**; -
Object.getOwnPropertyNames(obj)返回**所有自有属性名(无论是否可枚举)**。
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = { x: 1 };
Object.defineProperty(obj, 'y', { value: 2, enumerable: false });
Object.defineProperty(obj, 'z', { value: 3, enumerable: true });
console.log(Object.keys(obj)); // ['x', 'z']
console.log(Object.getOwnPropertyNames(obj)); // ['x', 'y', 'z']
不遍历原型链,只查自身
该方法不会访问原型上的属性。即使原型上有同名属性,也不会被列出:
const parent = { inherited: 'yes' };
const child = Object.create(parent);
child.own = 'no';
console.log(Object.getOwnPropertyNames(child)); // ['own']
console.log(Object.getOwnPropertyNames(parent)); // ['inherited']
如果想获取原型链上所有自有属性名,需手动遍历原型链(配合 Object.getPrototypeOf),但 getOwnPropertyNames 本身只作用于传入的那个对象。
对数组、函数等内置对象也适用
它适用于任何对象,包括数组、函数、日期等:
const arr = ['a', 'b'];
arr.custom = 'prop';
Object.defineProperty(arr, 'hidden', { value: 'shh', enumerable: false });
console.log(Object.getOwnPropertyNames(arr));
// ['0', '1', 'length', 'custom', 'hidden'] —— 数字索引、length、自定义属性全都会出现
注意:数组索引(如 '0'、'1')是字符串形式的自有属性名,也会被包含在结果中。
不复杂但容易忽略:它只管“自有”,不管“是否可枚举”,也不管“从哪来”。想全面了解对象结构,常和 Object.getPrototypeOf、Object.getOwnPropertyDescriptors 配合使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










