Object.getOwnPropertyNames仅返回对象自身的所有键名(含不可枚举),不包含原型链属性;适用于获取完整自有键,但需配合getOwnPropertyDescriptor判断属性特性,避免误用。

Object.getOwnPropertyNames 能直接获取对象自身的所有键名(包括不可枚举的),天然不包含原型链上的属性,因此它本身已规避原型干扰——关键在于理解它的行为边界和常见误用点。
只返回自身属性,不查原型链
该方法仅遍历目标对象**自有**(own)的属性键名,无论是否可枚举(如 constructor、length 在数组上,或通过 Object.defineProperty 设置的 enumerable: false 属性),都不会向上查找原型。例如:
- `Object.getOwnPropertyNames({ a: 1, b: 2 })` → `['a', 'b']`
- `const obj = Object.create({ x: 1 }); obj.y = 2; Object.getOwnPropertyNames(obj)` → `['y']`(
x不出现)
注意:不能替代 for...in 或 Object.keys 的语义场景
它不筛选可枚举性,所以会暴露很多“隐藏”键。若你实际需要的是可枚举自有属性(如 JSON 序列化前检查),应优先用 Object.keys;若需完整自有键(含不可枚举),才用 getOwnPropertyNames:
- `Object.keys({ a: 1 })` → `['a']`(安全、常用)
- `Object.getOwnPropertyNames(Object.assign(Object.create(null), { a: 1 }))` → `['a']`(无原型时结果一致,但非必须)
- 对 Date 实例调用:`Object.getOwnPropertyNames(new Date())` 返回大量内部属性如
'date'、'__proto__'等,多数无业务意义
配合 getOwnPropertyDescriptor 判断属性特性
当拿到键名后,常需确认其是否可写、是否可配置、是否可枚举。这时可结合 Object.getOwnPropertyDescriptor 使用:
- `const desc = Object.getOwnPropertyDescriptor(obj, 'prop'); desc?.writable === true`
- 可用于过滤出真正“可用”的自有属性,避免操作只读或不可配置项
警惕类数组对象与内置构造器实例
数组、函数、日期等内置类型实例有大量自有不可枚举属性,getOwnPropertyNames 会一并返回,容易造成误判:
- `Object.getOwnPropertyNames([])` 返回
['length'](不是空数组) - `Object.getOwnPropertyNames(function(){})` 返回
['length', 'name', 'arguments', 'caller']`</font></li> <li><font color="#2c5e1a">若目标是提取用户显式设置的字段,请先明确对象来源,必要时用 <code>Object.keys
+hasOwnProperty双重校验

















