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
相关产品推荐
相关产品推荐

