繁体   English   中英

对象方法“ hasOwnProperty”的行为不一致

[英]Inconsistent behaviour of object method 'hasOwnProperty'

问题陈述 :

如果对象具有与JavaScript预定义method相同的property名称。 它执行失败并给出以下错误。

未捕获的TypeError:obj.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')); // Uncaught TypeError: obj.hasOwnProperty is not a function 

代码说明:

在上面的代码片段中,我试图检查objectkey是否存在。

因此,在第一个console语句中,它以具有名为key2属性的obj1返回true ,但是当将名为"hasOwnProperty": "value3"新属性添加到对象中时,它将失败。

众所周知,使用JavaScript对象方法名称作为对象property不是一个好习惯,但是API团队并不了解JavaScript预定义方法。 因此,他们可以在API响应中发送它。

期望值:

我想使用hasOwnProperty()方法检查key2存在于obj2 ,是否具有hasOwnProperty属性。

任何帮助将是非常可贵的。 谢谢

您可以通过使用prototype方法并call将对象作为第一个参数传递来解决该问题:

 var obj2 = { "key1":"value1", "key2":"value2", "hasOwnProperty": "value3" } console.log(Object.prototype.hasOwnProperty.call(obj2, 'key2')); 

使用{}代替Object.prototype短一点,但这会产生一些Object.prototype开销:

{}.hasOwnProperty.call(obj2, 'key2')

备注

只要它继承自Object.prototype ,则用于访问hasOwnProperty属性的对象实际上是无关紧要的。 因此,可以通过使用其他一些不相关(或看似相关)的对象使事情看起来复杂:

Math.hasOwnProperty.call(obj2, 'key2')

Function.hasOwnProperty.call(obj2, 'key2')

obj1.hasOwnProperty.call(obj2, 'key2')

"".hasOwnProperty.call(obj2, 'key2')

NaN.hasOwnProperty.call(obj2, 'key2')

JSON.hasOwnProperty.call(obj2, 'key2')

Object.hasOwnProperty.call(obj2, 'key2')

...等;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM