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

jquery plugin options array, preventing array overwrite

本文关键字:数组 覆盖 选项 jquery 插件      更新时间:2023-10-31

我正在为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中。

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

jQuery.extend()的第一个参数可以是布尔值。如果是true,则扩展为"深度"(递归合并):

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

来自文档:

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