js 中对象的属性 hasOwnProperty - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
yantianqi

js 中对象的属性 hasOwnProperty

  •  
  •   yantianqi Aug 30, 2017 2963 views
    This topic created in 3179 days ago, the information mentioned may be changed or developed.

    在 underscore 中看到这样的代码,感觉有些奇怪

    // underscore 中的代码 _.has = function (obj, key) { return obj != null && hasOwnProperty.call(obj, key); }; 

    这里用hasOwnProperty.call(obj, key) 有什么特殊意义吗?
    obj.hasOwnProperty(key)有区别吗?

    8 replies    2017-08-31 10:21:57 +08:00
    xrr2016
        1
    xrr2016  
       Aug 30, 2017
    可能是为了不用去查找原型链吧
    kanezeng
        2
    kanezeng  
       Aug 30, 2017   3
    非要说不一样的话,就是避免 obj 如果重新定义了 hasOwnProperty 这个方法?
    比如 var obj = {
    hasOwnProperty(item) { return true; }
    }

    这时候如果你直接 obj.hasOwnProperty('随便什么') 返回都是 true。

    但是你用 Object.hasOwnProperty(obj, ’随便什么') 就会正确的返回 false。
    kanezeng
        3
    kanezeng  
       Aug 30, 2017
    非要说不一样的话,就是避免 obj 如果重新定义了 hasOwnProperty 这个方法?
    比如 var obj = {
    hasOwnProperty(item) { return true; }
    }

    这时候如果你直接 obj.hasOwnProperty('随便什么') 返回都是 true。

    但是你用 Object.hasOwnProperty.call(obj, ’随便什么') 就会正确的返回 false。
    cnnblike
        4
    cnnblike  
       Aug 30, 2017
    确保调用的是 Object 的原型里面的 hasOwnProperty,不一样的。

    仔细考虑一下调用的顺序,如果是 obj.hasOwnProperty(key),那么他会在这些上找:
    1.obj 本体
    2.obj 的原型链
    原型链上有任意一个对象有 hasOwnProperty,都会影响其行为。

    举个简单的例子,obj 原型为 obj_prototype,obj_prototype 原型为 object,而 obj_prototype 里面有个 hasOwnProperty,那么就出问题了。
    kfll
        5
    kfll  
       Aug 30, 2017 via Android
    不是所有对象都有 hasOwnProperty,比如 Object.create(null) 创建的对象
    doubleflower
        6
    doubleflower  
       Aug 31, 2017 via Android
    这时候可以看出来 python 设计比较先进,实例系统方法都是前后双下划线,不会和应用方法混淆
    meepo3927
        7
    meepo3927  
       Aug 31, 2017
    上面说的都对。

    underscore.js 毕竟是通用工具库,所以代码很严谨,需要考虑各种不常见的情况:
    1. obj 没有 hasOwnProperty 方法,直接 obj.hasOwnProperty 会报运行时错误;
    2. obj 上重新定义了 hasOwnProperty 方法,那么返回值是非预期的;
    3. obj 没有 hasOwnProperty 方法,但是其原型链上重新定义了 hasOwnProperty 方法,同上;

    嗯.
    meepo3927
        8
    meepo3927  
       Aug 31, 2017
    补充一下,还有一个好处如 1 楼所说,hasOwnProperty 是不查找原型链的,从性能上说,更好。

    当你有大量循环并且对象的原型链较深时,执行速度的差异会有所体现。
    About     Help     Advertise     Blog     API     FAQ     Solana     5822 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 268ms UTC 06:39 PVG 14:39 LAX 23:39 JFK 02:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86