hasownproperty 是 javascript 中检测对象自有属性的方法,挂载于 object.prototype,返回布尔值;需注意原型污染风险,推荐使用 object.hasown() 替代。

hasOwnProperty 是 JavaScript 中用于判断属性是否为对象自身拥有(即自有属性)而非从原型链继承的关键方法。它不关心原型上的同名属性,只检测对象自身的属性槽位。
用 hasOwnProperty 检测自有属性
该方法挂载在 Object.prototype 上,所有普通对象都可直接调用(前提是没被覆盖或删除)。
语法:obj.hasOwnProperty(propKey)
-
propKey必须是字符串或 Symbol - 返回
true表示该属性存在于对象自身(不是继承来的) - 返回
false表示:属性不存在,或仅存在于原型链上,或propKey是hasOwnProperty自身(它也是继承来的)
例如:
function Animal(name) {
this.name = name;
}
Animal.prototype.species = 'unknown';
const dog = new Animal('Buddy');
dog.age = 3;
dog.hasOwnProperty('name'); // true —— 构造函数中直接赋值
dog.hasOwnProperty('age'); // true —— 实例上新增
dog.hasOwnProperty('species'); // false —— 来自原型
dog.hasOwnProperty('toString'); // false —— 继承自 Object.prototype
注意原型污染与安全边界
hasOwnProperty 本身是继承的方法,因此存在风险:
- 若对象原型被篡改(如
Object.prototype.hasOwn = null),或对象无原型(如Object.create(null)),直接调用会报错或返回意外结果 - 若对象自身重写了
hasOwnProperty(如obj.hasOwnProperty = () => false),结果不可信
稳妥写法是借用原生方法:
Object.prototype.hasOwnProperty.call(obj, 'key')
这样绕过对象自身的 hasOwnProperty,强制使用 Object.prototype 上的标准实现。
在 for...in 循环中过滤继承属性
for...in 会遍历对象自身及整个原型链上可枚举的属性,常需配合 hasOwnProperty 筛选:
for (const key in dog) {
if (dog.hasOwnProperty(key)) {
console.log(`${key}: ${dog[key]}`); // 只输出 name、age
}
}
不加判断时,species 和 toString 等也可能被遍历到(取决于原型是否可枚举)。
替代方案:优先使用 Object.hasOwn()(ES2022+)
现代开发推荐用更安全、更语义清晰的 Object.hasOwn(obj, key):
- 不依赖对象原型,
Object.create(null)也能用 - 无需
.call()绑定,写法简洁 - 明确表达“检查对象自身是否拥有该属性”的意图
Object.hasOwn(dog, 'species'); // false Object.hasOwn(dog, 'age'); // true
它本质上是 hasOwnProperty 的升级替代,没有兼容性问题(Node.js ≥16.9 / Chrome ≥93 / Firefox ≥91 / Safari ≥15.4)。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











