Javascript 将配置对象传递给jQuery插件
我经常使用下面的设计模式来创建jQuery插件。我在插件中指定默认值,并允许用户在初始化插件时更改它们。通常,我的Javascript 将配置对象传递给jQuery插件,javascript,jquery,Javascript,Jquery,我经常使用下面的设计模式来创建jQuery插件。我在插件中指定默认值,并允许用户在初始化插件时更改它们。通常,我的default对象只包含字符串属性,而不是对象,但这次,我希望将其中一个默认属性设置为对象(default\u obj\u 1)。在脚本的底部,您可以看到我试图通过传递plugin{default\u value\u 2:666,default\u obj\u 1.default\u prop\u 3:434}来更改的一个属性,但它导致JavaScript无效并出错。我还尝试传递它{
default
对象只包含字符串属性,而不是对象,但这次,我希望将其中一个默认属性设置为对象(default\u obj\u 1
)。在脚本的底部,您可以看到我试图通过传递plugin{default\u value\u 2:666,default\u obj\u 1.default\u prop\u 3:434}
来更改的一个属性,但它导致JavaScript无效并出错。我还尝试传递它{default\u value\u 2:666,default\u obj\u 1:{default\u prop\u 3:434}
,但它似乎覆盖了其他应该保留的值
如何只更新jQuery插件中的一个默认值
(function($){
var defaults = {
default_value_1 : 123,
default_value_2 : 321,
default_value_3 : 111,
default_obj_1 : {
default_prop_1 : 444,
default_prop_2 : 534,
default_prop_3 : 231
}
};
var methods = {
init : function (options) {
var settings = $.extend({}, defaults, options);
return this.each(function () {
//Do something using settings
});
}
};
$.fn.myPlugin = function(method) {
if ( methods[method] ) {
return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.myPlugin' );
}
};
}(jQuery));
$(function(){
var myPlugin=$('#elem').myPlugin({default_value_2:666,default_obj_1.default_prop_3:434});
var myPlugin=$('#elem').myPlugin({default_value_2:666,default_obj_1:{default_prop_3:434} });
});
更改:
var settings = $.extend({}, defaults, options);
到
进行深度(递归)合并。Ah-ha!谢谢Mathlentics。我需要运行,但回来后会进行测试,并选择此作为答案(前提是它有效:)
var settings = $.extend(true, {}, defaults, options); // notice the first param TRUE