问题陈述:
如果具有与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响应中发送它。
期望:
我想使用property
中hasOwnProperty()
存在的key2
方法,而不是obj2
中包含hasOwnProperty
属性的方法。
任何帮助都会非常值得注意。感谢
答案 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')
...等; - )