在jQuery插件默认值中使用对象

时间:2014-02-19 18:12:38

标签: jquery jquery-plugins extend javascript-objects

我有一个代表我的问题的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并确保它们不会被覆盖?

2 个答案:

答案 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

Deep extension