hasOwnProperty 会失效的场景

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

发表评论

您的电子邮箱地址不会被公开。