hasOwnProperty 的核心作用是判断属性是否为对象自身所有而非继承自原型链。它只认对象“亲手添加”的属性,不认原型链“借来”的属性,无论该属性能否被正常访问或是否可枚举。

hasOwnProperty 的核心作用就是做这件事:只认对象自己“亲手加上的”属性,不认从原型链“借来的”。
它只看“所有权”,不看“能不能用”
一个属性即使能被对象正常访问(比如 person.age),只要不是直接定义在 person 上,hasOwnProperty 就会返回 false。它判断的不是“有没有这个值”,而是“这个键是不是属于这个对象本身”。
- 自身属性:通过
this.xxx = val、对象字面量{a: 1}、Object.defineProperty或obj.x = 1直接添加到对象上的 - 原型属性:定义在构造函数的
prototype上,或通过Object.create(prototypeObj)设置的原型链上继承来的
典型对比场景
比如:
function Animal(name) {
this.name = name; // 自身属性
}
Animal.prototype.species = 'mammal'; // 原型属性
<p>const dog = new Animal('Buddy');
-
dog.hasOwnProperty('name')→ true(构造函数里 this.name 赋值) -
dog.hasOwnProperty('species')→ false(来自 Animal.prototype) -
dog.species依然能取到值,但 hasOwnProperty 不认这笔“账”
遍历时必须配合 for...in 使用
for...in 天然会遍历所有可枚举属性,包括原型链上的;hasOwnProperty 是唯一轻量、标准、可靠的过滤手段:
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
for (let k in obj) { console.log(k); }→ 可能混入 toString、valueOf 等原型方法 - 正确写法:
for (let k in obj) { if (obj.hasOwnProperty(k)) { /* 处理自身属性 */ } }
注意边界情况
它不处理 Symbol 属性(需用 Object.getOwnPropertySymbols()),也不关心属性是否可枚举——哪怕某个自身属性被设为 enumerable: false,hasOwnProperty 仍返回 true。它只回答一个问题:“这个 key 是不是这个对象自己的?”


















