好吧,我想我明白了 Difference between jQuery.extend and jQuery.fn.extend?
因为一般扩展可以扩展任何对象,而fn.extend用于插件函数,可以使用一些内部jquery voodoo直接从jquery对象调用。
所以似乎人们会以不同的方式调用它们。如果你通过添加函数y使用一般扩展来扩展对象obj,那么该方法将附加到该对象,obj.y()但是如果你使用fn.extend那么它们是 直接附加到jquery对象$ .y()....我有没有正确的是或否,如果没有,我的理解是什么?
我正在阅读的这本书主张使用
jQuery.fn.extend({
a: function() { },
b: function() { }
});
语法,但在文档中说
jQuery.fn.a = function() { };
我想如果你想要b也是
jQuery.fn.b = function() { };
这些在功能和性能方面是否相同,如果没有,有什么区别?
非常感谢你。我在挖jQuery!
答案 0 :(得分:28)
它们之间有非常微妙的区别。性能明智(不是这是一个问题),jQuery.fn.extend
比直接声明像jQuery.fn.foo = function(){ };
这样的函数要慢。我说的是完全可以忽略的差异。
区别在于jQuery.fn.extend()
允许您同时添加多个插件功能,并且可能会使您的代码看起来更清晰一些,具体取决于您正在创作的插件类型。
jQuery.fn.a = function(){};
jQuery.fn.b = function(){};
与
完全相同jQuery.fn.extend({
a: function(){ },
b: function(){ }
});
答案 1 :(得分:6)
两种方式几乎完全相同。但是,在以下方面存在一些小差异 -
速度:
可忽略的。您可能会忽略这一方面,因为您不太可能注意到两者之间的性能差异。
代码风格:
扩展版本遵循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 更为可取。