hasOwnProperty 是对象用于判断属性是否为自有属性的内置方法,返回布尔值;必须通过实例调用,语法为 obj.hasOwnProperty(prop),可区分实例属性与原型属性,但不检测 Symbol 属性且无法判断 undefined 值是否存在。

hasOwnProperty 是对象的内置方法,用于判断某个属性是否直接定义在该对象自身上(即“自有属性”),而不是从原型链继承来的(即“原型属性”)。它返回布尔值:true 表示是自有属性,false 表示不是(可能是原型属性,也可能是根本不存在)。
基本用法:调用方式与返回值
必须通过对象实例调用,不能通过构造函数或类直接调用。语法为:obj.hasOwnProperty(prop),其中 prop 是字符串形式的属性名。
- 如果属性存在于对象自身(包括可枚举和不可枚举的自有属性),返回
true - 如果属性只存在于原型上,或对象没有该属性,返回
false - 注意:该方法不检测
undefined值本身——即使自有属性值为undefined,只要存在,仍返回true
常见误用:避免用 for...in 遍历时混淆原型属性
for...in 会遍历对象自身及整个原型链上的可枚举属性。若只想处理自有属性,需配合 hasOwnProperty 过滤:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
const parent = { name: 'Parent', sayHi() { return 'hi'; } };
const child = Object.create(parent);
child.age = 25;
for (let key in child) {
if (child.hasOwnProperty(key)) {
console.log(key, child[key]); // 只输出 'age' 25
}
}
替代方案与注意事项
ES6 提供了更现代的方式获取自有属性键:Object.keys() 和 Object.getOwnPropertyNames(),它们默认只返回自有属性(前者仅可枚举,后者包含不可枚举)。
立即学习“Java免费学习笔记(深入)”;
-
hasOwnProperty无法检测 Symbol 属性(除非显式传入 Symbol 类型的 key) - 若对象重写了自身的
hasOwnProperty方法(极少见),可能导致误判;此时可用Object.prototype.hasOwnProperty.call(obj, prop)安全调用 - 箭头函数、class 实例、数组等都继承自
Object.prototype,因此都可用该方法
实际判断示例
区分一个属性到底是定义在实例上,还是来自原型:
function Person(name) {
this.name = name; // 自有
}
Person.prototype.say = function() {}; // 原型
const p = new Person('Alice');
console.log(p.hasOwnProperty('name')); // true
console.log(p.hasOwnProperty('say')); // false
console.log(p.hasOwnProperty('toString')); // false(来自 Object.prototype)

















