You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript对象方法hasOwnProperty的不一致行为问题咨询

当对象存在与内置方法同名的属性时,调用hasOwnProperty报错的原因及解决办法

在JavaScript里,如果你碰到了Uncaught TypeError: obj.hasOwnProperty is not a function这个错误,十有八九是因为你的对象自身定义了一个和内置方法同名的hasOwnProperty属性,把原型链上的内置方法给覆盖了。

先看这个直观的示例:

var obj1 = { "key1":"value1", "key2":"value2" }
console.log(obj1.hasOwnProperty('key2')); // 正常输出 true

var obj2 = { "key1":"value1", "key2":"value2", "hasOwnProperty": "value3" }
console.log(obj2.hasOwnProperty('key2')); // 抛出类型错误

问题根源

hasOwnProperty是Object.prototype上的内置方法,所有普通对象都会继承这个方法来检测自身是否包含某个属性。但如果我们给对象自身添加了一个名为hasOwnProperty的属性(比如示例里的字符串"value3"),这个属性就会遮蔽原型链上的同名方法。此时obj2.hasOwnProperty不再是一个可调用的函数,而是我们定义的字符串值,调用它自然就会触发类型错误。

解决办法

这里有两种可靠的方式避开这个问题:

1. 直接调用原型上的方法并绑定目标对象

我们可以绕开对象自身的属性,直接使用Object.prototype.hasOwnProperty,通过call方法把目标对象作为this传入,这样就能正常检测属性了:

console.log(Object.prototype.hasOwnProperty.call(obj2, 'key2')); // 输出 true

2. 使用ES2022新增的Object.hasOwn方法

ES2022引入了Object.hasOwn这个更安全的替代方案,它专门用来检测对象自身是否包含某个属性,不需要担心原型链被覆盖的问题,用法也更简洁:

console.log(Object.hasOwn(obj2, 'key2')); // 输出 true

内容的提问来源于stack exchange,提问作者Rohít Jíndal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:40:32