今天看到一个文档,提示有如下两种方式来给defaults对象设置属性:
// bulk
$.cookie.defaults = { path: '/', expires: 365 };
// single
$.cookie.defaults.path = '/';
对JS的对象不是很了解,上面代码中的bulk方式,用一个JSON对象赋给defaults对象,不会造成defaults对象被覆盖吗?如果被覆盖了,那么该对象的其他属性的默认值岂不是全完了?
难道JS能自动识别赋值的对象是否是object?如果是的话,就只覆盖其中的属性;如果不是对象,则根据赋值对象的类型自动转换?
1
jybox 2015-01-29 09:58:12 +08:00 1
会覆盖,所以这种情况应该用 underscore.extend http://underscorejs.org/docs/underscore.html#section-85
但估计这个插件应该会自己在内部再维护一个默认选项,所以这个 $.cookie.defaults 就是用来给你直接覆盖的。 |
2
willwen 2015-01-29 09:58:15 +08:00 via iPhone 1
兩個思路
1. 第一種會覆蓋 2. 如果是一個setter+getter,可以不覆蓋 |
3
mingzepeng 2015-01-29 10:01:57 +08:00 1
bulk 这种方式,就是你理解的覆盖了,正确的说法应该是给$.cookie.defaults 重新赋予了一个对象,改变了$.cookie的默认参数值。
`难道JS能自动识别赋值的对象是否是object?如果是的话,就只覆盖其中的属性;如果不是对象,则根据赋值对象的类型自动转换? ` 对于这句,js当然没这么智能了。 |
4
rekey 2015-01-29 10:38:34 +08:00 1
@mingzepeng 参考2楼的 setter,是可以的做到那么智能的。
|
5
chshouyu 2015-01-29 10:49:59 +08:00
1楼的答案还是比较正确的,一般来说,一个结构化的jQuery插件,$.pluginName.defaults这个就是被用户用来覆盖掉的,而插件内部会有一个局部的defaults变量,通过$.extend({}, defaults, $.pluginName.defaults)来生成最终的配置选项
|
6
sneezry 2015-01-29 11:08:24 +08:00 via iPhone 1
报告楼主,我是来“找茬”的,第一种里那不是JSON,那是对象字面量。
|
7
mingzepeng 2015-01-29 12:15:11 +08:00 1
@rekey 嗯,通过setter确实可以做到
|
8
jprovim 2015-01-29 12:58:03 +08:00 1
為什麼不用這個?
$.cookie.defaults['path'] = '/' $.cookie.defaults['expires']= 365; |
9
rangercyh 2015-01-29 15:08:52 +08:00 1
@sneezry 那就是JSON,如果你要说不是JSON,那我就不知道你所指的JSON是什么了。虽然这里确实是叫对象字面量。
楼主的问题,第一种确实会覆盖,理由就像你理解的一样,清晰直白。所以我认为楼主困惑的其实是这个文档的说法,它说有两种方法来给defaults对象设置属性,确实这两种都给default设置了属性,但是它没说第一种是通过覆盖的方式来设置的,仅此而已。 |
10
lalalanet 2015-01-29 15:32:39 +08:00 1
第一种实际就是覆盖了,虽然JS现在有getter/setter了,但是考虑兼容性LZ的上下文里肯定不是这么设计的。
其他部分的默认值,可以在处理其他部分的时候再写一份 $.cookie.defaults.path || "/" 。JS的对象都是不可靠的,类库编写时就应该做这种假设。 |
11
sneezry 2015-01-30 14:35:44 +08:00
|