object.getownpropertynames() 返回对象所有自有属性名(含不可枚举属性,不含 symbol)。它不遍历原型链,与 object.keys() 的区别在于后者仅返回可枚举属性;需配合 object.getownpropertysymbols() 才能获取 symbol 属性。

Object.getOwnPropertyNames() 是 JavaScript 中用于获取对象**所有自有属性名(包括不可枚举属性)** 的静态方法。它只返回对象自身拥有的属性名(不包括原型链上的),且不管该属性是否可枚举(enumerable: false 也算在内)。
基本用法
语法很简单:
Object.getOwnPropertyNames(obj)
返回一个字符串数组,包含 obj 自身所有属性的键名(不含 Symbol 属性)。
和 Object.keys() 的关键区别
两者都只返回自有属性,但:
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
-
Object.keys():只返回 可枚举 的自有属性名; -
Object.getOwnPropertyNames():返回 所有 自有属性名(可枚举 + 不可枚举); - 二者都不包含 Symbol 类型的属性(要获取 Symbol 属性,需用
Object.getOwnPropertySymbols())。
实际例子:捕获不可枚举属性
比如通过 Object.defineProperty 定义了一个不可枚举属性:
const obj = { a: 1, b: 2 };
Object.defineProperty(obj, 'hidden', {
value: 'secret',
enumerable: false // 关键:设为 false
});
<p>console.log(Object.keys(obj)); // ['a', 'b']
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b', 'hidden'] ✅</p>
再比如,Array.prototype.length 在数组实例上是不可枚举的自有属性:
const arr = [1, 2, 3]; console.log(Object.getOwnPropertyNames(arr)); // ['0', '1', '2', 'length']
注意点和常见误区
- 只查「自有」属性:不会遍历原型链,
toString、hasOwnProperty等继承方法不会出现; - 不处理 Symbol:如果对象有 Symbol 类型的自有属性,必须配合
Object.getOwnPropertySymbols()使用; - 不能获取 getter/setter 的“值”,但能获取其属性名(只要它是自有属性);
- 对 null 或 undefined 调用会抛错,使用前建议加类型判断。
想拿到全部自有属性(含 Symbol + 不可枚举),可以组合使用:
const allKeys = [ ...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj) ];










