hasownproperty 是 javascript 中判断属性是否为对象自有属性的方法,只检查自身属性不查原型链,正确用法为 obj.hasownproperty('prop'),安全调用应使用 object.prototype.hasownproperty.call(obj, 'prop')。

hasOwnProperty 是 JavaScript 中用于判断一个属性是否为对象**自有属性**(即直接定义在该对象上,而非从原型链继承)的最常用方法。
基本用法:传入属性名字符串
调用方式是 obj.hasOwnProperty(prop),参数必须是字符串(属性名),返回布尔值:
- 如果属性存在且是对象自身的(不是继承来的),返回 true
- 如果属性不存在,或存在但来自原型链,返回 false
例如:
const obj = { a: 1, b: 2 };
obj.__proto__.c = 3; // 在原型上添加属性
console.log(obj.hasOwnProperty('a')); // true(自有)
console.log(obj.hasOwnProperty('c')); // false(继承自原型)
console.log(obj.hasOwnProperty('toString')); // false(继承自 Object.prototype)
注意:不能省略括号,也不能用点语法传参
hasOwnProperty 是方法,不是属性。常见错误写法:
-
obj.hasOwnProperty.a❌(这是访问 obj.hasOwnProperty 的 a 属性,不是调用) -
obj.hasOwnProperty 'a'❌(语法错误,缺少括号) -
obj.hasOwnProperty(a)❌(如果 a 是变量但未加引号,会当作变量值传入,容易出错)
正确写法始终是:obj.hasOwnProperty('a') 或 obj.hasOwnProperty(key)(key 是字符串变量)。
与 in 操作符的区别
prop in obj 检查的是**对象及其整个原型链**中是否存在该属性;而 hasOwnProperty 只检查对象自身。
-
'c' in obj→ true(因为原型上有 c) -
obj.hasOwnProperty('c')→ false
所以需要区分“是否存在”和“是不是自己的”这两个问题。
安全调用:避免对象自身重写 hasOwnProperty
极少数情况下,对象可能自己定义了名为 hasOwnProperty 的属性(覆盖了原型上的方法),导致直接调用失效。稳妥做法是借用 Object.prototype 的原生方法:
Object.prototype.hasOwnProperty.call(obj, 'a')
这样能确保使用的是标准的、未被覆盖的实现,尤其在处理不可信或动态构造的对象时更健壮。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











