object.getownpropertynames()只获取对象自身属性名,不包括原型链上的属性,因其设计目的就是检查目标对象自有属性,忽略继承属性;可配合object.getprototypeof()获取原型的自有属性名。

Object.getOwnPropertyNames() 只能获取对象自身的(即“自有”)属性名,**不包括原型链上的属性**。它和原型本身没有直接关系,也不会遍历原型链。
为什么 Object.getOwnPropertyNames() 拿不到原型上的属性?
因为它的设计目的就是只检查目标对象自身拥有的属性(无论是否可枚举、是否为函数),完全忽略从 __proto__ 或 prototype 继承来的属性。
- 例如:
{}.constructor是从Object.prototype继承的,Object.getOwnPropertyNames({})不会返回"constructor" - 即使你手动在原型上添加属性,比如
Array.prototype.myMethod = function(){},Object.getOwnPropertyNames([1,2])依然不会包含"myMethod"
想获取原型上的自有属性?得手动访问原型对象
如果真需要查看某个对象原型(比如 obj.__proto__)上定义的自有属性,可以对原型对象单独调用 Object.getOwnPropertyNames():
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Object.getOwnPropertyNames(Object.getPrototypeOf(obj))—— 获取 obj 直接原型的自有属性名 -
Object.getOwnPropertyNames(Object.prototype)—— 查看所有普通对象原型上的自有属性(如toString、valueOf等) - 注意:
Object.getPrototypeOf(obj)比直接读obj.__proto__更标准、更推荐
配合 getOwnPropertyDescriptors 看得更清楚
单纯看属性名可能不够,比如想确认某个属性是否可写、是否在原型上定义,可以结合:
-
Object.getOwnPropertyDescriptors(obj):返回自身所有属性的完整描述符 -
Object.getOwnPropertyDescriptors(Object.getPrototypeOf(obj)):查看原型上定义的属性配置(如configurable: false的内置方法)
常见误区提醒
别混淆这几个方法:
-
Object.keys(obj):只返回自身可枚举属性名 -
Object.getOwnPropertyNames(obj):返回自身所有属性名(包括不可枚举的,如length在数组上) -
for...in:遍历自身 + 原型链上可枚举属性(受hasOwnProperty()控制是否过滤原型) -
Reflect.ownKeys(obj):和Object.getOwnPropertyNames类似,但还包含 Symbol 属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










