jQuery源码的基础知识
序言:DOM?addEventListener
attachEvent與addEventListener區(qū)別
適應(yīng)的瀏覽器版本不同,同時在使用的過程中要注意
attachEvent方法????????? 按鈕onclick
addEventListener方法??? 按鈕click
一、arguments對象:
1、arguments 屬性
為當前執(zhí)行的function對象返回一個arguments對象。?
2、function.arguments
function參數(shù)是當前執(zhí)行函數(shù)的名稱,可以省略。?
3、arguments.length
arguments 對象的 length 屬性包含了傳遞給函數(shù)的參數(shù)的數(shù)目。arguments 對象所包含的單個參數(shù),訪問方法與數(shù)組中所包含的參數(shù)的訪問方法相同。?
4、arguments當作數(shù)組使用
arguments雖然不是數(shù)組,但可以當作數(shù)組使用,下標由 0 開始,所以:
arguments[0]? 表示接收的第一個參數(shù)
arguments[1]? 表示接收的第二個參數(shù)
……
for (var i = 1; i < arguments.length; i )
?? var s = arguments[i];? ??
5、arguments轉(zhuǎn)換數(shù)組
var args = Array.prototype.slice.call(arguments);?
二、call方法:
語法:call([thisObj[,arg1[, arg2[,?? [,.argN]]]]])
定義:調(diào)用一個對象的一個方法,以另一個對象替換當前對象。
說明:
call 方法可以用來代替另一個對象調(diào)用一個方法。call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對象。
如果沒有提供 thisObj 參數(shù),那么 Global 對象被用作 thisObj。?
三、apply方法:
語法:apply([thisObj[,argArray]])
定義:應(yīng)用某一對象的一個方法,用另一個對象替換當前對象。
說明:
如果 argArray 不是一個有效的數(shù)組或者不是 arguments 對象,那么將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個參數(shù),那么 Global 對象將被用作 thisObj, 并且無法被傳遞任何參數(shù)。?
四、call方法和apply方法的區(qū)別
call和apply方法通常被用來實現(xiàn)類似繼承一樣的功能,以達到代碼復用的功效。它們的區(qū)別主要體現(xiàn)在參數(shù)上。
Apply:
var v = new fn( " str " );?
// 上一句相當于下面的代碼?
var v = {};?
fn.apply(v, [ "str" ]);
五、prototype原型
1、當我們使用javascript定義一個類的時候,系統(tǒng)會自動生成一個對應(yīng)的原型,而使用類的prototype可以指向這個原型。?
2、定義類的時候,一般使用函數(shù)定義,而那個函數(shù)就是構(gòu)造函數(shù),構(gòu)造函數(shù)可以使用constructor來指定。?
3、當構(gòu)造函數(shù)和prototype定義了相同的屬性或者方法的時候,構(gòu)造函數(shù)的優(yōu)先級要更高。?
4、原型中,不能調(diào)用構(gòu)造函數(shù)的私有變量,和通過傳參傳進來的值。
?5、prototype中定義的變量和屬性都是公有的。?
?6、任何一個類,當有多次實例化的時候,在內(nèi)存中只有一個原型,而構(gòu)造函數(shù)在內(nèi)存中會有多個副本。?
7、在構(gòu)造函數(shù)中可以調(diào)用prototype中的屬性和方法。?
實例:
function fn(){};fn.prototype={pro:'原型'}var o=new fn();alert(o.pro);?六、匿名函數(shù)自動執(zhí)行(function(){……}())
1. 什么是自執(zhí)行的匿名函數(shù)?
它是指形如這樣的函數(shù): (function {// code})();
?2. 疑問
?為什么(function {// code})();可以被執(zhí)行, 而function {// code}();卻會報錯?
?3. 分析
(1). 首先, 要清楚兩者的區(qū)別:
?(function {// code})是表達式, function {// code}是函數(shù)聲明.
?(2). 其次, js"預編譯"的特點:
js在"預編譯"階段, 會解釋函數(shù)聲明, 但卻會忽略表式.
?(3). 當js執(zhí)行到function() {//code}();時, 由于function() {//code}在"預編譯"階段已經(jīng)被解釋過, js會跳過function(){//code}, 試圖去執(zhí)行();, 故會報錯;
當js執(zhí)行到(function {// code})();時, 由于(function {// code})是表達式, js會去對它求解得到返回值, 由于返回值是一 個函數(shù), 故而遇到();時, 便會被執(zhí)行.
另外, 函數(shù)轉(zhuǎn)換為表達式的方法并不一定要靠分組操作符(),我們還可以用void操作符,~操作符,!操作符……
如:?
!function(){????? alert("另類的匿名函數(shù)自執(zhí)行");??? }();?
七、自定義的extend靜態(tài)方法
方法一:
var fn=function(){};fn.extend = function(o, p) { if ( !p ) {p = o; o = this;} for ( var i in p )o[ i ] = p[ i ];alert(o[ i ]);alert(o);return o;}fn.extend({method:function(){alert("靜態(tài)方法");}});fn.method(); //靜態(tài)方法方法二:
var fn=function(){};fn.extend = function() { var options,target = arguments[0] || {};if ( !options ) {options = target; target = this;} for ( var i in options )target[ i ] = options[ i ];//執(zhí)行對象直接量,把options[ i ]裝載到target[ i ],最后返回target新對象。return target;}fn.extend({method:function(){alert("靜態(tài)方法");}});fn.method();源碼解析如下:
?
| var options={a:function(){alert("a");},b:function(){alert("b");}}var target={};for ( var i in options )target[i]=options[i];//復制對象,重新裝載target.a(); //a
|
????????????????????????????????????
?
方法三:
var fn=function(){};Object.extend = function(destination, source) {for (property in source) {destination[property] = source[property];}return destination;}Object.prototype.extend = function(object) {return Object.extend.apply(this, [this, object]);}fn.extend({method:function(){alert("靜態(tài)方法");}});fn.method();?
更多專業(yè)前端知識,請上 【猿2048】www.mk2048.com
總結(jié)
以上是生活随笔為你收集整理的jQuery源码的基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: seajs-require使用示例
- 下一篇: jQuery源码分析