hasOwnProperty()是检测对象自有属性的核心方法,仅检查自身属性不查原型链;为防对象重写该方法或为null原型对象,应统一用Object.prototype.hasOwnProperty.call(obj, prop)安全调用。

要检测属性是否直接存在于对象本身(即不是从原型链继承来的),核心方法是使用 hasOwnProperty(),但需注意安全调用方式。
用 hasOwnProperty 判断自有属性
obj.hasOwnProperty(prop) 是最直接的方式:它只返回 true 当且仅当该属性是对象自身的(enumerable 或 non-enumerable 都算),不查原型链。
- 如果对象没被污染(没重写
hasOwnProperty),可直接调用:obj.hasOwnProperty('name') - 若不确定对象是否覆盖了该方法(比如来自第三方库或
Object.create(null)),应使用安全写法:Object.prototype.hasOwnProperty.call(obj, 'name') - 注意:
Object.create(null)创建的对象没有hasOwnProperty方法,必须用call方式,否则报错
对比 in 操作符:为什么不能单靠它
'prop' in obj 会返回 true 即使属性在原型上(如 toString、valueOf),所以它适合“是否存在可用属性”,但不适合“是否为自有属性”。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 例如:
const obj = Object.create({x: 1});→'x' in obj是true,但obj.hasOwnProperty('x')是false - 想确认“原型属性”,实际就是:
'prop' in obj && !Object.prototype.hasOwnProperty.call(obj, 'prop')
其他可行但有局限的方法
某些场景下也可辅助判断,但各有边界:
立即学习“Java免费学习笔记(深入)”;
-
Object.keys(obj).includes('prop'):只检查可枚举的自有属性,对enumerable: false的属性无效 -
Reflect.ownKeys(obj).includes('prop'):能检测所有自有属性(包括不可枚举、Symbol),比Object.keys更全,但仍不查原型 - 避免用
obj.prop !== undefined:值本身就是undefined时会误判
实际推荐写法
日常开发中,统一用这个模式最稳妥:
Object.prototype.hasOwnProperty.call(target, key)- 兼容所有对象类型(包括
Object.create(null)) - 不依赖对象自身方法,规避被覆盖风险
- 准确反映属性归属,是判断“是否直接存在”的事实标准

















