hasOwnProperty 会失效的场景
2018-12-03 本文已影响2人
后除
一、hasOwnProperty 是什么
hasOwnProperty()
返回 true
/ false
,判断对象自身属性中是否具有指定的属性。和 in
的区别是 in
会判断原型链上继承下来的属性。
// 原型属性
Object.prototype.b = 2
// 自身属性
const foo = {
a: 1
}
// hasOwnProperty
console.log(foo.hasOwnProperty('a')) // true
console.log(foo.hasOwnProperty('b')) // false
// in
console.log('a' in foo) // true
console.log('b' in foo) // true
二、hasOwnProperty 失效场景
1.存在同名方法
自带方法 hasOwnProperty()
优先级比原型链上的 hasOwnProperty()
高,或者在原型链上有一环也有同名的方法 hasOwnProperty()
。
const foo = {
a: 1,
hasOwnProperty () {
return false
}
}
console.log(foo.hasOwnProperty('a')) // false
2.没有连接到 Object
原型
Object.create(null)
会创建一个空(null
)原型链接的对象,所以就不存在 Object.prototype
上面的方法 hasOwnProperty()
。这时候可以通过使用 call
/ apply
强行让对象使用方法 hasOwnProperty()
:Object.prototype.hasOwnProperty.call(ObjectInstance, attribute)
。
// 字面量
const foo = {
a: 1
}
console.log(foo.hasOwnProperty('a')) // true
// Object.create(null) 空原型链
const bar = Object.create(null)
bar.a = 1
console.log(bar.hasOwnProperty('a')) // Uncaught TypeError: bar.hasOwnProperty is not a function
// 显示绑定
console.log(Object.prototype.hasOwnProperty.call(bar, 'a')) // true