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

Inconsistent behaviour of object method 'hasOwnProperty'

问题陈述:

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

Uncaught TypeError: obj.hasOwnProperty is not a function

代码:

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 语句中它 returns true as obj1 having 属性 named as key2 但是当新的时候它失败了属性 添加到对象中,命名为 "hasOwnProperty": "value3"

据我们所知,使用 JavaScript 对象方法名称作为对象 property 不是一个好的做法,但 API 团队不知道 JavaScript 预定义方法。因此,他们可以在 API 响应中发送它。

期望:

我想使用 hasOwnProperty() 方法检查 obj2 中是否存在 key2 或其中是否包含 hasOwnProperty 属性。

您可以通过使用原型方法和 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')

...等等 ;-)