jQuery原始碼分析(一)

2021-08-07 14:11:28 字數 2759 閱讀 8326

(function

(window,undefined)

)(window)

jquery整體的內部實現都包含在乙個立即執行函式形成的閉包裡,只向外暴露jquery和$兩個變數,避免了全域性變數的汙染。

平時我們例項化jquery物件的時候,並不是像例項化普通物件一樣,使用new來例項化,而是直接$(「***」),這也是jquery的乙個亮點,jquery是如何來實現這一點的呢?

(function(window, undefined) ,

jquery.fn = jquery.prototype =

}jquery.fn.init.prototype = jquery.fn;

})(window);

以上是建立jquery例項的核心**,主要總結下來有以下幾點:

a.在使用$(「***」)例項化jquery物件的時候,實際上呼叫jquery原型上的init方法。例項化的工作實際是init完成的。

b. jquery.fn=jquery.prototype;

b.為了讓jquery例項能夠訪問到jquery原型上的方法,jquery做了這樣的處理:jquery.fn.init.prototype = jquery.fn;

// 獲取 title 屬性的值

$('#id').attr('title');

// 設定 title 屬性的值

$('#id').attr('title','jquery');

// 獲取 css 某個屬性的值

$('#id').css('title');

// 設定 css 某個屬性的值

$('#id').css('width','200px');

jquery中通過實現方法的過載,通過傳入引數的不同,實現不同的功能,使用起來非常方便。

在jquery中使用jquery.fn.extend 與 jquery.extend用來進行jquery方法的擴充套件。

jquery.extend()用來擴充套件jquery的物件方法,也就是我們通過$.method()呼叫的方法。

jquery.fn.extend()用來擴充套件jquery的例項方法,也就是jquery例項所具有的方法。$(「***」).method();

關於這兩個方法,看原始碼後我們會發現,他們實際上是基於同乙個函式實現的。因為this的指向不同,來達到不同的功能。即:

$.extend=$.fn.extend=function

()

關於這裡的這個function所做的事情,實際上做的就是乙個物件轉殖的工作,類似object.assign(),但object.assign()只能實現淺轉殖,$.extend()可以通過設定第乙個引數為true來實現深轉殖。

jquery.extend = jquery.fn.extend = function

() , //第乙個引數

i = 1,

length = arguments.length,

deep = false; //是否深轉殖

// handle a deep copy situation

//如果都乙個引數為boolean 則為是否開啟深遞迴 target指向下乙個引數

if ( typeof target === "boolean" ) ;

i++;

}// handle case when target is a string or something (possible in deep copy)

// 如果傳入的第乙個引數是 字串或者其他

if ( typeof target !== "object" && !jquery.isfunction( target ) ) ;

}// extend jquery itself if only one argument is passed

// 如果只有乙個引數

if ( i === length )

for ( ; i < length; i++ ) );

if ( target === copy )

// recurse if we're merging plain objects or arrays

//如果深轉殖開啟且copy為物件或陣列

//這裡判斷還可以用object.prototype.tostring.call(copy) 返回"[object array]或[object object]"

if ( deep && copy && ( jquery.isplainobject( copy ) ||

( copyisarray = array.isarray( copy ) ) ) ) else ;

}// never move original objects, clone them

target[ name ] = jquery.extend( deep, clone, copy );

// don't bring in undefined values

// 淺轉殖

} else

if ( copy !== undefined ) }}

}// return the modified object

return target;

};

另乙個讓大家喜愛使用 jquery 的原因是它的鏈式呼叫,這一點的實現其實很簡單,只需要在要實現鏈式呼叫的方法的返回結果裡,返回 this ,就能夠實現鏈式呼叫了。

jQuery原始碼分析

工具 版本說明 版本號備註 jquery 2.1.1 sublime 3jquery function selector,context jquery.fn jquery.prototype 快速匹配正則 不加g 不光匹配整體項還會匹配到子項 rquickexpr s w w w init jque...

jQuery原始碼分析

一 jquery如何做到不汙染變數名並暴露出 供使用者使用 jquery將變數和 寫進立即執行函式,通過函式來包裹所有的變數和方法,再在這個立即執行函式上將 jquery方法繫結到window上,就可以讓使用者使用到jq方法了。二 jquery是如何做到 jquery 的?function wind...

jQuery 原始碼分析

這篇文章可以說是讀這篇文章這篇文章後的總結。jquery最基本的構成結構 var jquery window.jquery window.function a,b jquery.fn jquery.prototype age function jquery.fn.init.prototype jqu...