一、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