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 · 3602 次点击
    这是一个创建于 3346 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天看到一个文档,提示有如下两种方式来给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   ·   我们的愿景   ·   实用小工具   ·   3377 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:20 · PVG 19:20 · LAX 04:20 · JFK 07:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.