对象方法'hasOwnProperty'的行为不一致

时间:2018-04-04 11:57:16

标签: javascript json object methods ecmascript-5

问题陈述:

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

  

未捕获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

代码说明:

在上面的代码段中,我试图检查key的{​​{1}}是否存在。

因此,在第一个object语句中,它将console返回为true,其属性名为obj1,但在添加了名为key2的新属性时失败进入对象。

我们知道将JavaScript对象方法名称用作对象"hasOwnProperty": "value3"不是一个好习惯,但API团队不了解JavaScript预定义方法。因此,他们可以在API响应中发送它。

期望:

我想使用propertyhasOwnProperty()存在的key2方法,而不是obj2中包含hasOwnProperty属性的方法。

任何帮助都会非常值得注意。感谢

1 个答案:

答案 0 :(得分:3)

您可以使用原型方法和call来传达您的对象作为第一个参数:



var obj2 = {
  "key1":"value1",
  "key2":"value2",
  "hasOwnProperty": "value3"
}

console.log(Object.prototype.hasOwnProperty.call(obj2, 'key2'));




使用{}代替Object.prototype稍微短一点,但这会产生一些微不足道的开销:

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

备注

用于访问hasOwnProperty属性的对象确实无关紧要,只要它继承自Object.prototype即可。所以你可以通过使用其他一些不相关的(或看似相关的)对象来使事情变得复杂:

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')

...等; - )