どちらの方法もほとんど同じです。ただし、次の点でいくつかの小さな違いがあります-
- スピード
- コードスタイル
- プラグインに他の場所で名前を付ける
スピード:
無視できる。2つのパフォーマンスの違いに気付く可能性は低いため、この側面は無視してかまいません。
コードスタイル:
拡張バージョンは、オブジェクトリテラルコードスタイルに準拠しています。これは、一部の人にとっては少しエレガントに見えるかもしれません。たとえば、プラグインがObjectリテラルを豊富に使用している場合は、$。extend({})を使用してラップすることをお勧めします。
プラグインに他の場所で名前を付ける:
$ .fn.aスタイルを使用することにはもう1つの(重要な、私の意見では)利点があります-プラグインの名前をコード内のどこかに保存し、プラグインをjQueryの名前空間に追加するときにその参照を使用できます。オブジェクトリテラルを使用して拡張する場合、これは実行できません。この利点は、コードの長さとプラグイン名の出現回数にいくらか関連しています。また、平均的なコーダーがプラグインの名前を変更することはめったにないと主張する人もいるかもしれません。変更した場合、ほとんどの場合、それほど時間はかかりません。
例:
;(function($) {
// Declare your plugin's name here
var PLUGIN_NS = 'myPluginName';
// ... some arbitrary code here ...
// The jQuery plugin hook
$.fn[ PLUGIN_NS ] = function( args ) {
if ( $.type(args) !== 'object' )
var args = {};
var options = $.extend({}, $.fn[ PLUGIN_NS ].defaults, args);
// iterate over each matching element
return this.each({
var obj = $(this);
// we can still use PLUGIN_NS inside the plugin
obj.data( PLUGIN_NS+'Data' , args );
// ... rest of plugin code ...
});
};
// ----------------
// PRIVATE defaults
// ----------------
var defaults = {
foo: 1,
bar: "bar"
};
// ------------------------------------------------------------
// PUBLIC defaults
// returns a copy of private defaults.
// public methods cannot change the private defaults var.
// ------------------------------------------------------------
// we can use PLUGIN_NS outside the plugin too.
$.fn[ PLUGIN_NS ].defaults = function() {
return $.extend({}, defaults);
};
})(jQuery);
これで、プラグインとデフォルトを次のように呼び出すことができます。
$("div#myDiv").myPluginName({foo:2});
var originalFoo = $("div#myDiv").myPluginName.defaults().foo;
プラグインの名前を変更するには、PLUGIN_NS変数を変更します。これは、プラグインコード内で出現するmyPluginNameを変更するよりも望ましい場合があります。