本来是一个很简单的需求:

const a = {
  b:1
}

本来我的需求是判断,这个a对象里面b是否存在,但是b的值不确定,他可能是布尔值false,也可能是数字0,或者是空字符。

那么if(a.b)就不太行了,一般来说,老前端一般都是用in 操作符。

"b" in a;  //true

但是es6后,一般来说,不建议这样使用的,同时不建议的还有delete操作符。

于是问了下群友,因为我记得es6有那么一个方法,可以判断一个对象的属性是否存在,并且不会去查prototype上的内容。但是我忘了啥名字来着!

const a = {
  b:1
}

a.hasOwnProperty("b"); //true

到这,基本上就行了,函数式操作判断,新的特性,完美达到我的要求!

但是,群友的又开始骚操作了

const a = {
  hasOwnProperty: () => '傻了吧',
}

a.hasOwnProperty("b"); //"傻了吧"

好家伙,直接就给覆盖了继承的hasOwnProperty方法,这我就很尴尬了。

最后迫于无奈,为了准确性,我们还得这么写:

Object.prototype.hasOwnProperty.call(target,key);

但是我call基本没怎么用过,是个短板,这个可能也记不住,记个笔记!

分类: JavaScript 标签: javascripthasOwnProperty

评论

全部评论 7

  1. 我杰哥
    我杰哥
    Google Chrome Windows 10
    到底是哪个群友,发的“傻了吧”
  2. 铁牛
    铁牛
    Google Chrome Windows 10

    let a = {
    b: 1
    }

    function hasOwnProperty1 (target, key) {
    return Function.prototype.call.bind(Object.prototype.hasOwnProperty)(target, key)
    }

    function hasOwnProperty2 (target, key) {
    return Object.prototype.hasOwnProperty.call(target, key)
    }

    console.log(hasOwnProperty1(a, 'b'));
    console.log(hasOwnProperty2(a, 'b'));[调皮]

    1. 木灵鱼儿
      木灵鱼儿
      FireFox Windows 10
      @铁牛好家伙,你用函数对象运行Object的方法???有什么特殊用意吗?[tv_疑问]
      1. 铁牛
        铁牛
        Google Chrome Windows 10
        @木灵鱼儿[doge]在这里没啥卵用,但是可以让代码看起来更难懂。
        1. 木灵鱼儿
          木灵鱼儿
          FireFox Windows 10
          @铁牛[妙啊]妙啊妙啊。。。
  3. 铁牛
    铁牛
    Google Chrome Windows 10

    function hasOwnProperty () {
    return Function.prototype.apply.bind(Object.prototype.hasOwnProperty);
    }
    //使用方法
    a.hasOwnProperty('b')

    1. 木灵鱼儿
      木灵鱼儿
      FireFox Windows 10
      @铁牛hasOwnProperty 方法都没运行,你a.hasOwnProperty触发的还是原生方法

目录