イーサン、ここで提唱されているプラグインパターンを使用すると、プライベート関数やさまざまなパブリックメソッドなど、さまざまな可能性が1つのプラグイン内に存在します。
あなたはプライベートな機能を持つことができ、それらはおそらく(ある種の)連鎖可能である可能性がありますが:
- 内部呼び出しは。で行われる傾向があるため、通常、内部でチェーンすることはできません
.call()
。
- パブリックメソッドは通常、の形式であるため、通常、内部で連鎖性を必要としないか、必要としません。
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」の両方によって内部的に呼び出されます。
あなたは呼び出すことができます
$("div").foo(); //same as $("div").foo(init');
$("div").foo('bar', 'cough from bar');
ただしcough
、外部から呼び出すことはできません。
注:上記のパターンでは、スーパーバイザーは常にまったく同じです。編集する必要はありません。