再來看一下jQuery的擴展方法吧,這可是jQuery的核心。
其實這個方法并不復雜,它的功能有以下幾個
1.對object jQuery的擴展,也就是做成所謂的Utilities方法集,方便大家使用jQuery.functionName()的方式調(diào)用。
2.對jQuery.fn(也就是jQuery.fn.init.prototype,也就是jQuery.fn.init的實例,也就是調(diào)用$()方法返回的對象)的擴展,擴充jQuery實例的功能。
3.對object進行屬性或者方法的復制(包括深度復制)。
對jQuery以及jQuery.fn進行擴充,從source里可以看出,因為參數(shù)只有一個,走的是個很簡單的路徑,如果把source抽出來,就如同下面所示:
- jQuery.extend = jQuery.fn.extend = function() {
-
- var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
-
-
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
-
- if ( (options = arguments[ i ]) != null ) {
-
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
-
- if ( target === copy ) {
- continue;
- }
-
- if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
-
- return target;
- };
除去雜亂的變量聲明,賦值以及判斷。其實就是簡單的對對象的屬性方法擴充。
如果不是深度復制,那基本上就是對對象方法的clone了,從jQuery的source來看,就是把對象object的方法屬性賦值一份。如:5557行(以版本1.4.2的普通版為準)
- var opt = jQuery.extend({}, optall)
就是把object optall里的屬性方法clone給一個空的object。
剝離出的代碼如下:
- jQuery.extend = jQuery.fn.extend = function() {
-
- var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
-
-
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- for ( ; i < length; i++ ) {
-
- if ( (options = arguments[ i ]) != null ) {
-
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
-
- if ( target === copy ) {
- continue;
- }
-
-
- if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
-
- return target;
- };
從source的4931行,還可以看出,這個方法除了clone外,還可以覆蓋掉原有object的默認設(shè)置。
- jQuery.extend( jQuery.ajaxSettings, settings );
深度復制其實就是如果復制對象的屬性里有object或者數(shù)組的話,使用遞歸的方式把它們都復制過來。
舉個例子來講
- var src = {name:"wqf"};
- var copy = {info:{company:"macrohard",position:"CEO"}};
- var ret =jQuery.extend(true,src,copy);
得到的結(jié)果就是
- ret ={name:"wqf",info:{company:"macrohard",position:"CEO"}}
當然,如果出現(xiàn)重復的屬性或者方法的話,也會覆蓋掉。
這個方法并不復雜,可是卻是jQuery里比較重要的一個方法,弄清楚它的幾個作用,有助于快速理清一些方法的實現(xiàn)。
|