我有一个代表我的问题的codepen: http://codepen.io/anon/pen/ibwvl
在codepen中,我创建了一些简单的插件初始化函数,并在应用程序开始运行时注销设置。
我的问题是,当我console.log(app.settings)
时,我看到我的默认对象,以及新选项对象合并在一起,但我没有看到我内部的最后一个键默认对象(foo3)。这是因为$.extend()
运行时,选项对象会覆盖默认对象吗?如果是这样,有没有办法将嵌套对象与$ .extend()?
为清楚起见:
默认对象:
var defaults = {
test: 'foo',
obj: {
key1: null,
key2: null,
key3: 'foo3'
}
}
选项对象:
$('#foo').fooTest({
obj: {
key1: 'foo1',
key2: 'foo2'
}
});
记录app.settings
时的结果:
test: 'foo',
obj: {
key1: null,
key2: null
}
}
key3
去了哪里?
是否因为将新obj定义为obj: {}
的选项插件而被覆盖?
如果是这样,我如何对嵌套对象使用extend并确保它们不会被覆盖?
答案 0 :(得分:3)
使用deep
功能的jQuery.extend
参数。这将使扩展函数递归。
app.settings = $.extend(true, {}, defaults, options);
From here,您可以找到有关jQuery.extend
函数及其用法的更多示例。
但要小心,因为它是在jQuery v1.1.4中添加的,正如官方文档所述,不支持为第一个参数传递false
。
答案 1 :(得分:2)
是的,你的对象被覆盖了。但幸运的是,$.extend
接受布尔值作为允许深度扩展的第一个参数。
只是做:
app.settings = $.extend(true, defaults, options); //this will override defaults
app.settings = $.extend(true, {}, defaults, options); //this will not
//app.settings will be the same with both way