hasownproperty是javascript中用于准确判断对象是否拥有自身属性(非继承)的内置方法,可安全过滤原型链属性,常用于for...in循环、深拷贝等场景,但需防重写失效,推荐用object.prototype.hasownproperty.call(obj, prop)调用。

hasOwnProperty 是 JavaScript 中对象的内置方法,用于判断某个属性是否为该对象**自身拥有**(即直接定义在对象上),而不是从原型链继承来的。
为什么需要 hasOwnProperty?
JavaScript 对象通过原型链共享属性。遍历对象时(比如用 for...in),会把自身和原型上的可枚举属性都列出来。但很多时候你只关心对象“自己”的属性,比如做深拷贝、序列化、校验字段等。这时就要排除掉原型上的属性,hasOwnProperty 就是标准且安全的判断方式。
基本用法:检查单个属性
语法很简单:obj.hasOwnProperty(prop),返回布尔值。
- true:属性存在于对象自身(不是继承来的)
- false:属性不存在,或仅存在于原型上
示例:
const parent = { name: 'Parent', sayHi() { return 'Hi'; } };
const child = Object.create(parent);
child.age = 25;
console.log(child.hasOwnProperty('age')); // true → 自身属性
console.log(child.hasOwnProperty('name')); // false → 继承自 parent
console.log(child.hasOwnProperty('sayHi')); // false → 继承自 parent
console.log(child.hasOwnProperty('toString')); // false → 继承自 Object.prototype
常用于 for...in 循环中过滤原型属性
for...in 会遍历整个原型链上的可枚举属性,所以必须配合 hasOwnProperty 使用才能只处理自身属性:
for (const key in child) {
if (child.hasOwnProperty(key)) {
console.log(`自身属性: ${key} = ${child[key]}`);
}
}
// 输出:自身属性: age = 25
⚠️ 注意:不要省略这个判断!否则容易误操作原型方法(比如意外调用 toString 或覆盖 constructor)。
替代方案与注意事项
- Object.keys(obj) 返回的数组只含自身可枚举属性,天然规避原型问题,适合批量获取键名
-
Object.getOwnPropertyNames(obj) 返回所有自身属性(包括不可枚举的),比
hasOwnProperty更底层 - 避免直接调用
obj.hasOwnProperty—— 如果对象自身重写了该方法(比如{ hasOwnProperty: null }),会出错。更稳妥写法是:Object.prototype.hasOwnProperty.call(obj, 'prop') - ES6+ 可考虑用 Reflect.has(obj, prop),但它检测的是「能否访问到」(含原型),不区分来源,不能替代
hasOwnProperty
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











