0

我正在为 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);

问题是,当我尝试覆盖其中一个类名时,整个数组null都会在未指定属性的地方用值覆盖。

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

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

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

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

4

1 回答 1

1

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

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

从文档:

执行的合并$.extend()默认不是递归的;如果第一个对象的属性本身是一个对象或数组,它将被第二个对象中具有相同键的属性完全覆盖。这些值没有合并...但是,通过为第一个函数参数传递 true ,对象将被递归合并

于 2012-07-18T10:13:37.650 回答