Javascript 编写jQuery插件,将$.extend设置为可在其他函数上访问

Javascript 编写jQuery插件,将$.extend设置为可在其他函数上访问,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我正在学习编写一些jQuery插件,在我使用的结构之前: !(function($){ var defaults = { target: '' }; $.fn.myplugin = function(options){ var opts = $.extend({}, defaults, options) return this.each(function(){ //

我正在学习编写一些jQuery插件,在我使用的结构之前:

!(function($){
    var defaults = {
        target: ''
    };

    $.fn.myplugin = function(options){
        var opts = $.extend({}, defaults, options)  
               return this.each(function(){ 
                  //
               });
    }
})(jQuery);
现在,我想为我的插件应用一些更新方法,所以我在github上签出了一些插件。这是一个非常适合我的结构:

!(function($){
    var defaults = {
        target: ''
    },
    build = function(){
    },
    methods = {
        init: function(options){
            var settings = $.extend({}, defaults, options)
        },
        update: function(){
        }
    };

    $.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('error message');
        }
    }
})(jQuery);
但是,
$.extend
是在
init
函数上声明的,我在访问其他函数(如
build
上的设置)时遇到问题。我只能通过在
init
内部调用函数
build
并传递这样的参数来访问它(这是一件可怕的事情):


我需要将
$.extend({},默认值,选项)
移动到其他地方,以便在
init
之外的函数上访问它。请帮帮我,谢谢

使用
.data()
jQuery函数在元素上存储
设置

methods = {
    init: function(options){
        var settings = $.extend({}, defaults, options);
        this.data('settings', settings);
    },
    update: function(){
        var settings = this.data('settings');

    }
};
更完整的代码:

!(function($){
   var defaults = {
       target: ''
   },
   build = function(settings){
      // use settings.target here
   },
   methods = {
       init: function(options){
           var settings = $.extend({}, defaults, options)
           this.data('settings', settings);
       },
       update: function(){
          var settings = this.data('settings');
          build(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('error message');
       }
   }})(jQuery);
使用此插件:

$(element).myplugin();
$(element).myplugin('update');

当我调用
$(element).myplugin('update')
时,我得到了一个错误,因为设置仍然是
未定义的
-
未捕获类型错误:无法读取未定义的
的属性'target'。首先你应该调用
$(element).myplugin()
然后调用
$(element).myplugin('update')
$(element).myplugin();
$(element).myplugin('update');