两种方式几乎相同。但是,在以下方面存在一些小的差异 -
- 速度
- 代码风格
- 在别处命名你的插件
速度:
微不足道。您可能会忽略这一方面,因为您不太可能注意到两者之间的性能差异。
代码风格:
扩展版本遵循 Object 文字代码样式,这对某些人来说可能看起来更优雅一些。例如,如果您的插件大量使用 Object 字面量,您可能更喜欢使用 $.extend({}) 来包装它。
在别处命名你的插件:
使用 $.fn.a 样式还有另一个(在我看来是显着的)优势 - 您可以将插件的名称存储在代码中的任何位置,然后在将插件添加到 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 var。这可能比更改插件代码中每次出现的myPluginName 更好。