通過jQuery源碼學習javascript(一)

來源:互聯網
上載者:User

Jquery這麼普及,必有它過人之處,通過開原始碼進行學習,是個不錯的學習方法啊!

以下是我類比的方法,我盡量簡化方法。

定義對象C(類似於jquery的$方法)——這個也是jquery設計非常巧妙的地方

複製代碼 代碼如下:
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
         console.log(this);
return this;
},
test : function () {
console.log('test');
}
};
cQuery.fn.init.prototype = cQuery.fn;
window.C = window.cQuery = cQuery;
})();

C().test();

輸出結果

程式碼分析

1、把cQuery註冊到window屬性中,當成全域變數使用。用C做為簡易名稱。

window.C = window.cQuery = cQuery;

2、
cQuery.fn.init.prototype = cQuery.fn;
  拿圖說話(列印當前對象cQuery):

去掉該句。  

填上此句:

痛點分析:原型傳遞
  init的原型只是當前的函數。 

  用cQuery.fn.init.prototype = cQuery.fn;覆蓋init構造器的原型對象,從而實現跨域訪問。
評估:
  這是一招妙棋,new cQuery.fn.init()建立的新對象擁有init構造器的prototype原型對象的方法,通過改變prototype指標的指向,使其指向cQuery類的prototype。——這樣建立出來的對象就繼承了cQuery.fn原型對象定義的方法。
  3、用一個var定義變數,函數。Jquery源碼裡用了79行定義了一連串的變數(在開頭部分)。

each方法
複製代碼 代碼如下:
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
return this;
},
each : function(obj, callback) { // each 方法
var name, length = obj.length;
for (name in obj) {
if (callback.call(obj[name], name, obj[name]) === false) {
break;
}
}
},
isWindow : function(obj) {
return obj != null && obj == obj.window;
}
};
cQuery.fn.init.prototype = cQuery.fn;
window.C = window.cQuery =cQuery;
})();

C().each({ Height : 'height', Width : 'width'}, function(name, type){ console.log(this, name, type); });

輸出結果

痛點分析:callback.call(obj[name], name, obj[name])
callback是function(name, type){ console.log(this, name,type);}這個方法
第一個obj[name]是"height“或"width"字串,是callback函數裡的this。
name,第二個obj[name]是傳給callback的參數。

isWindow()方法

在上面代碼的基礎上,進行編寫:
複製代碼 代碼如下:
isWindow : function(obj) {
return obj != null && obj == obj.window;
}

調用:
複製代碼 代碼如下:
console.log(cquery.isWindow(window));
console.log(cquery.isWindow(document));

輸出結果

window對象有一個特殊的屬性window,等價於 self 屬性,它包含了對視窗自身的引用。通過這個屬性判斷是否是window對象!

總結

  我也是剛開始研究。可能有些地方說的不是很清楚,如果有人能給我補充,那再好不過了。
  時間不早了,下回再接著研究。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.