对象方法的不一致行为 '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
代码解释:
在上面的代码片段中,我试图检查 object
的 key
是否存在。
因此,在第一个 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')
...等等 ;-)
问题陈述:
如果对象具有与 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
代码解释:
在上面的代码片段中,我试图检查 object
的 key
是否存在。
因此,在第一个 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')
...等等 ;-)