我不确定 jQuery UI 是如何做到的(你必须查看源代码),但这里有一种方法可以做到这一点https://gist.github.com/elclanrs/5668357
使用这种方法的优点是您可以通过使用闭包将所有方法保留在原型中而不是在原型中;在这种情况下是一个模块模式。
编辑:好吧,明白了。这就是我让它工作的方式。我称之为“高级 jQuery 样板”。我将方法添加到原型中,我认为将它们保留在外面并没有真正的区别,并且可以更容易地在方法中调用方法this.method()
:
(function($) {
var _pluginName = 'myplugin'
, _defaults = {
};
function Plugin(el, options) {
this.opts = $.extend({}, _defaults, options);
this.el = el;
this._init();
}
Plugin.prototype = {
_init: function() {
return this;
},
method: function(str) {
console.log(str);
return this;
}
};
Plugin.prototype[_pluginName] = function(method) {
if (!method) return this._init();
try { return this[method].apply(this, [].slice.call(arguments, 1)); }
catch(e) {} finally { return this; }
};
$.fn[_pluginName] = function() {
var args = arguments;
return this.each(function() {
var instance = $.data(this, 'plugin_'+ _pluginName);
if (typeof args[0] == 'object') {
return $.data(this, 'plugin_'+ _pluginName, new Plugin(this, args[0]));
}
return instance[_pluginName].apply(instance, args);
});
};
}(jQuery));
现在我有两个 div:
<div></div>
<div id="mydiv"></div>
我可以像这样使用插件:
$('div').dialog({ n: 69 }); // initialize both divs
console.log($('#mydiv').dialog('method', 'hello world'));
//=^ prints "hello world" and returns instance
console.log($('#mydiv').data('plugin_dialog').opts.n); //=> 69
它基本上存储了插件的实例,data
以便能够恢复选项,因为此信息已附加到元素。它类似于jQuery Boilerplate的工作方式。