jQuery源碼的基礎知識

來源:互聯網
上載者:User

序言:DOM addEventListener

attachEvent與addEventListener區別
適應的瀏覽器版本不同,同時在使用的過程中要注意
attachEvent方法          按鈕onclick
addEventListener方法    按鈕click

一、arguments對象:

1、arguments 屬性

為當前執行的function對象返回一個arguments對象。 

2、function.arguments

function參數是當前執行函數的名稱,可以省略。 

3、arguments.length

arguments 對象的 length 屬性包含了傳遞給函數的參數的數目。arguments 對象所包含的單個參數,存取方法與數組中所包含的參數的存取方法相同。 

4、arguments當作數組使用

arguments雖然不是數組,但可以當作數組使用,下標由 0 開始,所以:

arguments[0]  表示接收的第一個參數
arguments[1]  表示接收的第二個參數
……

for (var i = 1; i < arguments.length; i++)

   var s = arguments[i];    

5、arguments轉換數組

var args = Array.prototype.slice.call(arguments); 

二、call方法:

文法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

定義:調用一個對象的一個方法,以另一個對象替換當前對象。

說明:

call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的物件內容從初始的上下文改變為由 thisObj 指定的新對象。

如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。 

三、apply方法:

文法:apply([thisObj[,argArray]])

定義:應用某一對象的一個方法,用另一個對象替換當前對象。

說明:

如果 argArray 不是一個有效數組或者不是 arguments 對象,那麼將導致一個 TypeError。

如果沒有提供 argArray 和 thisObj 任何一個參數,那麼 Global 對象將被用作 thisObj, 並且無法被傳遞任何參數。 

四、call方法和apply方法的區別

call和apply方法通常被用來實作類別似繼承一樣的功能,以達到代碼複用的功效。它們的區別主要體現在參數上。

Apply:

var v = new fn( " str " ); 

// 上一句相當於下面的代碼 

var v = {}; 

fn.apply(v, [ "str" ]);

五、prototype原型

1、當我們使用javascript定義一個類的時候,系統會自動產生一個對應的原型,而使用類的prototype可以指向這個原型。 

2、定義類的時候,一般使用函數定義,而那個函數就是建構函式,建構函式可以使用constructor來指定。 

3、當建構函式和prototype定義了相同的屬性或者方法的時候,建構函式的優先順序要更高。 

4、原型中,不能調用建構函式的私人變數,和通過傳參傳進來的值。

 5、prototype中定義的變數和屬性都是公有的。 

 6、任何一個類,當有多次執行個體化的時候,在記憶體中只有一個原型,而建構函式在記憶體中會有多個副本。 

7、在建構函式中可以調用prototype中的屬性和方法。 

執行個體:

function fn(){};fn.prototype={    pro:'原型'}var o=new fn();alert(o.pro); 

六、匿名函數自動執行(function(){……}())

1. 什麼是自執行的匿名函數?

它是指形如這樣的函數: (function {// code})();

 2. 疑問

 為什麼(function {// code})();可以被執行, 而function {// code}();卻會報錯?

 3. 分析

(1). 首先, 要清楚兩者的區別:

 (function {// code})是運算式, function {// code}是函式宣告.

 (2). 其次, js"先行編譯"的特點:

js在"先行編譯"階段, 會解釋函式宣告, 但卻會忽略表式.

 (3). 當js執行到function() {//code}();時, 由於function() {//code}在"先行編譯"階段已經被解釋過, js會跳過function(){//code}, 試圖去執行();, 故會報錯;

當js執行到(function {// code})();時, 由於(function {// code})是運算式, js會去對它求解得到傳回值, 由於傳回值是一 個函數, 故而遇到();時, 便會被執行.

另外, 函數轉換為運算式的方法並不一定要靠分組操作符(),我們還可以用void操作符,~操作符,!操作符……

如: 

!function(){      alert("另類的匿名函數自執行");    }(); 

七、自訂的extend靜態方法

方法一:

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("靜態方法");      }});fn.method(); //靜態方法

方法二:

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 ];//執行對象直接量,把options[  i ]裝載到target[ i ],最後返回target新對象。    return target;}fn.extend({      method:function(){           alert("靜態方法");      }});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("靜態方法");      }});fn.method();

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.