JavaScript 中使用 hasOwnProperty 检查对象自有方法

hasOwnProperty能检查自有方法,因方法是函数类型的自有属性;自有方法指直接定义在对象自身的函数属性,非原型继承;检查失败常见于方法在原型上、不可枚举或对象无hasOwnProperty继承。

javascript 中使用 hasownproperty 检查对象自有方法

JavaScript 中 hasOwnProperty 不能用于检查对象的“自有方法”,因为它只检测**自有属性(own property)**,而方法本质上是函数类型的属性值——只要该方法是直接定义在对象自身上(而非原型链上),hasOwnProperty 就能正确返回 true

什么是“自有方法”?

“自有方法”指直接挂载在对象自身上的函数属性,不是从 prototype 继承来的。例如:

“`js
const obj = {
  getName() { return ‘Alice’; },
  age: 30
};
console.log(obj.hasOwnProperty(‘getName’)); // true ← 是自有属性,值为函数
“`

这里 getName 是对象自身的可枚举属性,类型是 functionhasOwnProperty 检查的是键名是否存在且为自有属性,不关心值的类型。

立即学习“Java免费学习笔记(深入)”;

为什么有时检查失败?

常见误解是“方法一定在原型上”,导致误判。以下情况会返回 false

  • 方法定义在原型上(如通过 classprototype 添加)
  • 属性被 Object.defineProperty 设置为不可枚举且未显式指定 enumerable: true
  • 使用 Object.create(null) 创建的对象,没有继承 hasOwnProperty 方法(需用 Object.prototype.hasOwnProperty.call(obj, key)

更安全的检查方式

若需确认某 key 对应的是“函数类型的自有属性”,建议组合判断:

  • 先用 obj.hasOwnProperty(key) 确保是自有属性
  • 再用 typeof obj[key] === 'function' 确认值为函数
  • 对 null/undefined 安全:可写成 obj.hasOwnProperty(key) && typeof obj[key] === 'function'

例如:
“`js
const obj = { run() {} };
if (obj.hasOwnProperty(‘run’) && typeof obj.run === ‘function’) {
  // ✅ 确实是自有方法
}
“`

替代方案:Reflect.has 与 in 的区别

Reflect.has(obj, key) 等价于 key in obj,检查的是**自有 + 继承**属性;而 hasOwnProperty 只查自有。所以:

  • 要区分“是否自己定义了这个方法”,必须用 hasOwnProperty
  • 若只想知道能否调用(不管在哪定义),用 key in obj 更合适

文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/123740.html

如何配置打包工具的裁剪规则强制剔除包含函数表达式副作用的片段
上一篇 2026-07-01 13:13
Nginx 中 worker?connections 怎么做才能提升稳定性
下一篇 2026-07-01 13:13

相关推荐