javascript中无法直接遍历原型对象上的所有属性名而不涉及实例自身属性,因为for...in会遍历整个原型链上可枚举的自有和继承属性,而object.getownpropertynames()只返回当前对象自身的属性名(含不可枚举),不包括原型上的;要获取指定原型对象(如array.prototype)的自有可枚举属性名,应使用object.keys(proto),若需包含不可枚举属性则用object.getownpropertynames(proto)。

JavaScript 中无法直接“遍历原型对象上的所有属性名”而不涉及实例自身属性,因为 for...in 会遍历**整个原型链上可枚举的自有属性和继承属性**,而 Object.getOwnPropertyNames() 只能获取**当前对象自身的属性名(含不可枚举)**,不包括原型上的。
明确目标:只取某一个原型对象上的可枚举属性名
比如你想获取 Array.prototype 上所有可枚举的属性名(如 "push"、"map"),但排除 Object.prototype 上的(如 "toString")。这时需要:
- 先拿到目标原型对象(如
Array.prototype) - 用
Object.keys()或Object.getOwnPropertyNames()获取它的自有属性名 - 注意:这些方法返回的只是该对象自身定义的属性,不包含它从上级原型继承来的 —— 这正是你想要的“原型对象上的属性”,而非“原型链上的所有属性”
获取指定原型对象的自有属性名(含不可枚举)
例如查看 Array.prototype 自身有哪些属性名:
const proto = Array.prototype; console.log(Object.getOwnPropertyNames(proto)); // → ["length", "constructor", "concat", "join", "push", "pop", ...]
这包括不可枚举属性(如 length)。如果只想要可枚举的,用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
console.log(Object.keys(proto)); // 只返回可枚举的自有属性名
区分“原型对象自身”和“原型链继承”
常见误区是以为 for...in 能只遍历某个原型。实际上它会顺着原型链一直往上,直到 null。要限制在某一级原型,必须显式指定对象:
-
Object.getOwnPropertyNames(Array.prototype)→ 只是Array.prototype自己的属性 -
Object.getOwnPropertyNames(Object.prototype)→ 只是Object.prototype自己的属性 -
for...in []→ 遍历数组实例 +Array.prototype+Object.prototype上所有可枚举属性
安全获取某对象的直接原型上的可枚举属性名
如果你有一个实例 arr = [],想获取它**直接原型**(即 Array.prototype)上的可枚举属性名,可以这样:
const arr = []; const directProto = Object.getPrototypeOf(arr); // Array.prototype const protoKeys = Object.keys(directProto); console.log(protoKeys); // ["push", "pop", "shift", ...](可枚举的)
如果还要包含不可枚举的,把 Object.keys 换成 Object.getOwnPropertyNames 即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










