关于 JS 的对象赋值问题求教! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
flash866
V2EX    Javascript

关于 JS 的对象赋值问题求教!

  •  
  •   flash866 2015-01-29 09:53:35 +08:00 4161 次点击
    这是一个创建于 3912 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天看到一个文档,提示有如下两种方式来给defaults对象设置属性:
    // bulk
    $.cookie.defaults = { path: '/', expires: 365 };
    // single
    $.cookie.defaults.path = '/';

    对JS的对象不是很了解,上面代码中的bulk方式,用一个JSON对象赋给defaults对象,不会造成defaults对象被覆盖吗?如果被覆盖了,那么该对象的其他属性的默认值岂不是全完了?

    难道JS能自动识别赋值的对象是否是object?如果是的话,就只覆盖其中的属性;如果不是对象,则根据赋值对象的类型自动转换?

    11 条回复    2015-01-30 14:35:44 +08:00
    jybox
        1
    jybox  
       2015-01-29 09:58:12 +08:00   1
    会覆盖,所以这种情况应该用 underscore.extend http://underscorejs.org/docs/underscore.html#section-85

    但估计这个插件应该会自己在内部再维护一个默认选项,所以这个 $.cookie.defaults 就是用来给你直接覆盖的。
    willwen
        2
    willwen  
       2015-01-29 09:58:15 +08:00 via iPhone   1
    思路
    1. 第一覆
    2. 如果是一setter+getter,可以不覆
    mingzepeng
        3
    mingzepeng  
       2015-01-29 10:01:57 +08:00   1
    bulk 这种方式,就是你理解的覆盖了,正确的说法应该是给$.cookie.defaults 重新赋予了一个对象,改变了$.cookie的默认参数值。

    `难道JS能自动识别赋值的对象是否是object?如果是的话,就只覆盖其中的属性;如果不是对象,则根据赋值对象的类型自动转换? `

    对于这句,js当然没这么智能了。
    rekey
        4
    rekey  
       2015-01-29 10:38:34 +08:00   1
    @mingzepeng 参考2楼的 setter,是可以的做到那么智能的。
    chshouyu
        5
    chshouyu  
       2015-01-29 10:49:59 +08:00
    1楼的答案还是比较正确的,一般来说,一个结构化的jQuery插件,$.pluginName.defaults这个就是被用户用来覆盖掉的,而插件内部会有一个局部的defaults变量,通过$.extend({}, defaults, $.pluginName.defaults)来生成最终的配置选项
    sneezry
        6
    sneezry  
       2015-01-29 11:08:24 +08:00 via iPhone   1
    报告楼主,我是来“找茬”的,第一种里那不是JSON,那是对象字面量。
    mingzepeng
        7
    mingzepeng  
       2015-01-29 12:15:11 +08:00   1
    @rekey 嗯,通过setter确实可以做到
    jprovim
        8
    jprovim  
       2015-01-29 12:58:03 +08:00   1
    什不用?

    $.cookie.defaults['path'] = '/'
    $.cookie.defaults['expires']= 365;
    rangercyh
        9
    rangercyh  
       2015-01-29 15:08:52 +08:00   1
    @sneezry 那就是JSON,如果你要说不是JSON,那我就不知道你所指的JSON是什么了。虽然这里确实是叫对象字面量。
    楼主的问题,第一种确实会覆盖,理由就像你理解的一样,清晰直白。所以我认为楼主困惑的其实是这个文档的说法,它说有两种方法来给defaults对象设置属性,确实这两种都给default设置了属性,但是它没说第一种是通过覆盖的方式来设置的,仅此而已。
    lalalanet
        10
    lalalanet  
       2015-01-29 15:32:39 +08:00   1
    第一种实际就是覆盖了,虽然JS现在有getter/setter了,但是考虑兼容性LZ的上下文里肯定不是这么设计的。

    其他部分的默认值,可以在处理其他部分的时候再写一份 $.cookie.defaults.path || "/" 。JS的对象都是不可靠的,类库编写时就应该做这种假设。
    sneezry
        11
    sneezry  
       2015-01-30 14:35:44 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1006 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 18:28 PVG 02:28 LAX 11:28 JFK 14:28
    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