要避开原型属性需只访问对象自身属性,可用hasOwnProperty判断归属、Object.keys获取自有可枚举属性、Object.getOwnPropertyDescriptors查看完整自有属性信息,避免直接使用for...in。

要避开原型上的属性,关键在于只访问对象自身的属性,而不是通过原型链继承来的。JavaScript 提供了几个原生方法来区分“自有属性”和“原型属性”,合理使用它们就能精准遍历对象自身可枚举属性,避免污染或误读。
用 hasOwnProperty 过滤原型属性
这是最常用也最直接的方式:对每个属性名调用 obj.hasOwnProperty(prop),返回 true 表示该属性存在于对象自身(而非原型上)。
- 它不关心属性是否可枚举,只判断归属;
- 注意:不能用于
null或undefined,需先确保对象存在; - ES6 中仍推荐此法,兼容性极好。
用 Object.keys 获取自有可枚举属性
Object.keys(obj) 返回一个数组,仅包含对象自身且可枚举的属性名,天然跳过原型链上的所有属性。
- 适合遍历时需要属性名列表的场景,比如
for...of或forEach; - 不包括不可枚举属性(如
constructor、toString等默认不可枚举的); - 如果需包含不可枚举属性,得用
Object.getOwnPropertyNames。
用 Object.getOwnPropertyDescriptors 查看完整自有属性信息
当你不仅要知道属性名,还要确认其可枚举性、可配置性、是否为访问器等细节时,这个方法更可靠。
立即学习“Java免费学习笔记(深入)”;
- 返回一个对象,键为自有属性名,值为对应属性描述符;
- 能明确区分哪些是对象自己定义的,哪些来自原型;
- 配合
Object.keys或Reflect.ownKeys可做精细控制。
避免用 for...in 直接遍历(除非手动过滤)
for...in 会遍历整个原型链上所有可枚举属性,极易误触原型方法(如数组的 forEach、对象的 toString)。
- 若必须用
for...in,务必搭配hasOwnProperty判断; - 现代代码中,优先选用
Object.keys+for...of更清晰安全; - 注意:
Object.prototype被篡改时,hasOwnProperty可能失效,可用Object.prototype.hasOwnProperty.call(obj, prop)防御。


















