Javascript 扩展jQuery插件并更改默认值

Javascript 扩展jQuery插件并更改默认值,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我有一个名为“myPlugin”的插件,它使用常用的默认值设计模式,可以在初始化时重写 我不想在初始化时传递覆盖值,而是将插件扩展为“myPlugin2”,并更改默认值,以便在初始化扩展插件时,它已经具有所需的新默认值 我一直在尝试向扩展插件添加新方法,但我不知道如何更改默认值 换句话说,我希望这两行代码提供相同的结果 $("body").myPlugin({'prop1':'prop1 modified','default_func4':function () {console.log('de

我有一个名为“myPlugin”的插件,它使用常用的默认值设计模式,可以在初始化时重写

我不想在初始化时传递覆盖值,而是将插件扩展为“myPlugin2”,并更改默认值,以便在初始化扩展插件时,它已经具有所需的新默认值

我一直在尝试向扩展插件添加新方法,但我不知道如何更改默认值

换句话说,我希望这两行代码提供相同的结果

$("body").myPlugin({'prop1':'prop1 modified','default_func4':function () {console.log('default_func4 modified')}});
$("body").myPlugin2();
如何扩展jQuery插件并更改默认值


测试
(函数($){
var默认值={
“prop1”:“prop1”,
'default_func4':函数(){console.log('default_func4');},
'default_func5':函数(){console.log('default_func5');}
};
var方法={
初始化:函数(选项){
console.log(“init”);
log('defaults',defaults);
console.log('options',options);
var设置=$.extend({},默认值,选项);
console.log('settings',settings);
console.log('prop1'的值为'+settings.prop1');
settings.default_func4.call()
},
func1:function(){console.log(“func1”);},
func2:function(){console.log(“func2”);}
};
$.fn.myPlugin=函数(方法){
//方法调用逻辑
if(方法[方法]){
返回方法[method].apply(this,Array.prototype.slice.call(arguments,1));
}else if(typeof方法=='object'| |!方法){
return methods.init.apply(这是参数);
}否则{
$.error('Method'+Method+'不存在');
}
};
})(jQuery);
(函数($){
var方法={
'func1':函数(){console.log(“myPlugin2:func1”);},
'func3':函数(){console.log(“myPlugin2:func3”);}
}
$.fn.myPlugin2=函数(方法){
//如何更改defaults.prop1和defaults.default_func5?????
//方法调用逻辑
if(方法[方法]){
返回方法[method].apply(this,Array.prototype.slice.call(arguments,1));
}else if((typeof method=='object'| |!method)&&methods.init){
return methods.init.apply(这是参数);
}否则{
试一试{
返回$.fn.myPlugin.apply(这是参数);
}捕获(e){
$错误(e);
}
}
}
})(jQuery);
$(函数(){
$(“body”).myPlugin({
“prop1”:“prop1已修改”,
'default_func4':函数(){console.log('default_func4 modified')}
});
$(“body”).myPlugin2();
//$(“body”).myPlugin2('func1');
//$(“body”).myPlugin2('func2');
//$(“body”).myPlugin2('func3');
});

对method参数的双重检查让我觉得有点奇怪,但是如果我将try块中的一行替换为下面的代码,那么它的工作原理应该是一样的,同时仍然允许您为对象提供甚至不同的选项

var args = arguments;
if (typeof method === 'object' || !method) {
   // Fill args with the new defaults.
   args = {
      'prop1': 'prop1 modified',
      'default_func4': function () {
         console.log('default_func4 modified')
      }
   };
   $.extend(args, method);
   args = [args];
}
return $.fn.myPlugin.apply(this, args);

新对象是否应该扩展
args
而不是将
args
设置为新对象?啊,
args
的第一个元素似乎与
方法相同,如果我没记错的话,当您使用$.extend时,第一个的属性会被第二个的属性覆盖。这就是为什么我首先将参数更改为默认值,然后使用方法参数扩展它们。这样,您仍然可以覆盖默认值。
var args = arguments;
if (typeof method === 'object' || !method) {
   // Fill args with the new defaults.
   args = {
      'prop1': 'prop1 modified',
      'default_func4': function () {
         console.log('default_func4 modified')
      }
   };
   $.extend(args, method);
   args = [args];
}
return $.fn.myPlugin.apply(this, args);