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

2015-01-29 09:53:35 +08:00
 flash866

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

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

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

3626 次点击
所在节点    JavaScript
11 条回复
jybox
2015-01-29 09:58:12 +08:00
会覆盖,所以这种情况应该用 underscore.extend http://underscorejs.org/docs/underscore.html#section-85

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

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

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

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

其他部分的默认值,可以在处理其他部分的时候再写一份 $.cookie.defaults.path || "/" 。JS的对象都是不可靠的,类库编写时就应该做这种假设。
sneezry
2015-01-30 14:35:44 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/166402

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX