美文网首页让前端飞前端开发笔记
hasOwnProperty 会失效的场景

hasOwnProperty 会失效的场景

作者: 后除 | 来源:发表于2018-12-03 11:17 被阅读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
    

    相关文章

      网友评论

        本文标题:hasOwnProperty 会失效的场景

        本文链接:https://www.haomeiwen.com/subject/lctycqtx.html