jquery插件选项数组,防止数组覆盖

时间:2012-07-18 10:11:01

标签: javascript jquery jquery-plugins

我正在为jquery编写一个插件,我使用了这样的代码来允许用户指定插件的选项:

var settings = $.extend({
    url     : 'error.json',
    slotWidth   : 100,
    slotHeight  : 100,
    gridWidth   : 6,
    gridHeight  : 3,
    basketLayers    : 1,
    layerDirection  : "vertical",
    classNames  : {
            productPanelParent  : '.products-panel-parent',
            productPanelTabs    : '.products-panel-tabs',
            productPanelGroup   : '.products-panel-container',
            productPanel    : '.products-panel',
            productBasketParent : '.products-basket-parent',
            productBasketGroup  : '.products-basket-container',
            productBasket   : '.products-basket',
            productBasketMenu   : '.products-basket-menu',
            basketSlot      : '.basket-slot',
            basketSlotFull  : '.basket-slot-full',
            basketSlotHelper    : '.basket-slot-highlight',
            product     : '.product',
            resetBasket     : '.clearBasket',
            resetLayer      : '.clearLayer',
            viewLayer       : '.viewLayer'
          }
}, options);

问题在于,当我尝试覆盖其中一个classNames时,只要没有对属性进行特定处理,整个数组就会被null值覆盖。

例如,我会做这样的事情:

$('#somediv').myPlugin({
    gridWidth : 4,
    gridHeight : 2,
    classNames : {
        productBasket : '.small_basket'
    }
});

settings.classNames.productBasket属性将是正确的值,但所有内容都在settings.classNames中将为null。

我该如何解决这个问题? (没有编写自定义函数来处理数组中的默认值?)

1 个答案:

答案 0 :(得分:1)

jQuery.extend()的第一个参数可以是布尔值。如果它是true,则扩展名为“deep”(递归进行合并):

var settings = $.extend(true, defaults, options);

来自文档:

  

默认情况下,$.extend()执行的合并不是递归的;如果一个   第一个对象的属性本身就是一个对象或数组,它将是   被第二个中具有相同键的属性完全覆盖   宾语。值未合并...但是,通过传递true   第一个函数参数,对象将以递归方式合并

相关问题