Object.getOwnPropertyNames 返回对象自身所有字符串属性名(含不可枚举),不访问原型链,也不包含 Symbol 属性;需配合 Object.getOwnPropertySymbols 才能获取全部自有属性。

Object.getOwnPropertyNames 能直接获取对象自身(不含原型链)的所有可枚举和不可枚举属性名,不访问原型上的属性,是避开原型链最直接的方式。
只返回对象自身的属性名
它不会遍历原型链,只检查目标对象自身定义的属性(包括 不可枚举 属性),比如通过 Object.defineProperty 设置的 enumerable: false 属性也会被列出。
- 对比
Object.keys():后者只返回可枚举属性,且同样不查原型 - 对比
for...in:它会遍历整个原型链上所有可枚举属性,不符合“避开原型链”需求 - 对比
Object.getPrototypeOf(obj)+ 手动遍历:没必要,getOwnPropertyNames一步到位
注意:不包含 Symbol 属性
该方法只返回字符串类型的属性键。如果对象自身有 Symbol 类型的属性(如 Symbol('id')),它们不会出现在结果中。
- 要同时获取 Symbol 属性,需配合
Object.getOwnPropertySymbols() - 合并两者可用:
[...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)]
典型使用场景
适合需要完整检视对象“表面结构”的情况,比如序列化前分析、深拷贝判断、调试时查看真实属性构成。
立即学习“Java免费学习笔记(深入)”;
- 检测是否含有隐藏属性(如
__proto__、constructor等——但注意这些通常是原型上的,getOwnPropertyNames不会返回,除非手动在实例上定义) - 复制不可枚举属性时,可结合
Object.getOwnPropertyDescriptor获取描述符再用Object.defineProperty复制 - 避免误读继承来的属性,例如判断某个 key 是否真属于该对象实例


















