Ethan,使用这里提倡的插件模式,存在一系列可能性,包括私有函数和一系列公共方法都在一个插件中。
您可以拥有私有函数,并且可以想象它们是可链接的(某种程度上),但是:
- 您通常不能在内部进行链接,因为内部调用往往使用
.call()
.
- 您通常不希望或需要内部可链接性,因为公共方法通常是 form
return this.each(function(){...});
,并且在此循环中,代码处理它所作用的 jQuery 选择的单个元素。
例如 :
(function($){
// **********************************
// ***** Start: Private Members *****
var pluginName = 'foo';
var cough = function(text, bgColor) {
text = text || '';
bgColor = bgColor || '#FFF';
$(this).append($('<p/>').append(text).css('backgroundColor', bgColor));
};
// ***** Fin: Private Members *****
// ********************************
// *********************************
// ***** Start: Public Methods *****
var methods = {
init: function(text) {
text = text || 'foo init!';
return this.each(function() {
methods.bar.call($(this), 'cough from bar from init');
cough.call($(this), 'cough from init');
});
},
bar: function(text) {
text = text || 'cough from bar!';
return this.each(function() {
cough.call(this, text, '#99CC99');
});
}
};
// ***** Fin: Public Methods *****
// *******************************
// *****************************
// ***** Start: Supervisor *****
$.fn[pluginName] = 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 in jQuery.' + pluginName );
}
};
// ***** Fin: Supervisor *****
// ***************************
})(jQuery);
这里插件'foo'有一个公共方法'init'和'bar',以及一个私有实用程序'cough',它在内部由init
'bar'和'bar'调用。
你可以打电话
$("div").foo(); //same as $("div").foo(init');
$("div").foo('bar', 'cough from bar');
但是cough
不能被外部调用。
注意:在上面的模式中,主管总是完全相同的——不需要编辑。