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

JavaScript 中 hasOwnProperty 不能用于检查对象的“自有方法”,因为它只检测**自有属性(own property)**,而方法本质上是函数类型的属性值——只要该方法是直接定义在对象自身上(而非原型链上),hasOwnProperty 就能正确返回 true。
什么是“自有方法”?
“自有方法”指直接挂载在对象自身上的函数属性,不是从 prototype 继承来的。例如:
“`js
const obj = {
getName() { return ‘Alice’; },
age: 30
};
console.log(obj.hasOwnProperty(‘getName’)); // true ← 是自有属性,值为函数
“`
这里 getName 是对象自身的可枚举属性,类型是 function,hasOwnProperty 检查的是键名是否存在且为自有属性,不关心值的类型。
立即学习“Java免费学习笔记(深入)”;
为什么有时检查失败?
常见误解是“方法一定在原型上”,导致误判。以下情况会返回 false:
- 方法定义在原型上(如通过
class或prototype添加) - 属性被
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