Object.keys只返回对象自身可枚举属性的键名,不包含原型链上的属性,因其设计行为限定为检查自身且enumerable为true的属性。

Object.keys 默认就只返回对象**自身可枚举属性的键名**,不会包含原型链上的属性,所以你不需要额外“避开”原型——它本来就不遍历原型。
为什么 Object.keys 不会拿到原型上的属性?
这是它的设计行为:只检查对象自身的、且 enumerable: true 的属性。即使你在 Object.prototype 或某个父构造函数的 prototype 上定义了可枚举属性,Object.keys(obj) 也不会返回它们。
例如:
Object.prototype.protoProp = 'from prototype';
Object.defineProperty(Object.prototype, 'hidden', {
value: 'secret',
enumerable: false
});
const obj = { ownProp: 'yes' };
console.log(Object.keys(obj)); // ['ownProp'] —— protoProp 和 hidden 都没出现
哪些方法会拿到原型上的属性?(对比参考)
如果你之前混淆了,可能是因为用了其他遍历方式:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
-
for...in:会遍历自身 + 原型链上所有可枚举属性(需配合hasOwnProperty过滤) -
Object.getOwnPropertyNames():返回自身所有属性(包括不可枚举的),但依然不包括原型上的 -
Reflect.ownKeys():同Object.getOwnPropertyNames+Symbol键,也只限自身
需要确保“纯实例属性”时的注意事项
虽然 Object.keys 天然安全,但仍有两点实际中容易出错:
- 属性被定义为 不可枚举(
enumerable: false)时,Object.keys就看不到它 —— 这不是原型问题,而是属性描述符设置导致的 - 使用了
Object.create(null)创建的对象,没有原型,但Object.keys行为不变,依然只返回自身可枚举属性 - ES6 class 中的实例属性(如
this.x = 1)和类字段(x = 1)都是自身可枚举属性,Object.keys能正常获取
真要检查是否来自原型?用 hasOwnProperty 最直接
如果逻辑中确实需要区分来源(比如调试或特殊过滤),可以显式判断:
const obj = { a: 1 };
Object.prototype.b = 2;
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('b')); // false

















