1. 程式人生 > >Jquery 萬行程式碼解析之路(一)—jquery物件

Jquery 萬行程式碼解析之路(一)—jquery物件

從今天開始讀Jquery原始碼,並開始解析原始碼的思路,記下來備忘。後邊會整理出一個完整的。

Write less,Do more!—Jquery理念

想必只要是學過前端,學過html+css+js這一套用來寫網頁的技術的人必然不能不知道大名鼎鼎的Jquery,但這裡還是給零基礎的童鞋進行一下科普,Jquery是一個前端js庫,用來簡便的操作DOM和Ajax,並且在建立動畫,事件繫結上也比原生的js方便很多,極大的提高了前端程式猿們的開發效率,同時Jquery的閉包防止作用域汙染,模組化(需要一定的版本)等非常完善。據說全世界一萬個最熱門的網站中有百分之55的網站使用Jquery,Jquery的例項可見一斑。

$('.class').html();
$('.class').find(selecter).val();
$().ready()

我們平常用Jquery來操作DOM時,上述的程式碼不少見,從程式碼中我們可以看出$()即Jquery()函式返回的應該是一個具有各種Jquery內部函式的物件,但卻又不是一般的建構函式(理由和原因後邊說),對應這下邊的原始碼來看。

    // Jquery定義
    jQuery = function( selector, context ) {

        //這裡其實返回的是new jQuery.fn.init( selector, context )
return new jQuery.fn.init( selector, context ); }

為什麼要返回new jQuery.fn.init()呢
首先解釋一下jQuery.fn就是jQuery.prototype兩者是等價的,只是讓字面上看上去是操縱的fn而不是原型,原型中的init方法是如下定義的

var init = jQuery.fn.init = function( selector, context, root ) {
    //裡面的內容暫時先不寫,大致是用來對selector進行分析然後建立物件用的
}
//在這個函式後邊有如下程式碼
// Give the init function the jQuery prototype for later instantiation(將jquery的原型賦給init的原型,既讓init物件和jQuery物件擁有一樣的原型)
init.prototype = jQuery.fn;

那為什麼要如此麻煩的構造呢,注意到原始碼是使用嚴格模式進行編碼的,也就是說this在非new的函式中是undefined,而使用者在使用jQuery的時候並沒有去new $()或者new jQuery()這種方式,所以必須在內部new一個物件返回出去,但是原意是想new一個jQuery物件卻又想用jQuery這個函式若是程式碼按如下的方式寫

// Jquery定義
    jQuery = function( selector, context ) {

        //這裡其實返回的是new jQuery.fn.init( selector, context )
        return new jQuery( selector, context );

    },

聰明的讀者一看就知道會造成迴圈構造,所以這個方法是行不通的,所以jQuery的作者使用了一種非常巧妙的方法去做這種事這就是上邊為什麼這麼做的原因。
來解釋一下這麼做為什麼是可行合理的,首先,jQuery()函式返回的是new的一個jQuery.fn.init()物件,並不是jQuery物件,若僅僅這樣,init物件並不是jQuery,並沒有jQuery的所有方法,所以在後邊又用init.portotype = jQuery.portotype來使init成為jquery的一個引用,使得new出來的物件具有jQuery的所有方法,有讀者又會問,jQuery呼叫init,init原型又是jQuery的原型就不會造成迴圈了嗎,答案是不會的,因為這裡只是原型的引用,在執行的時候並不會去執行,就像學過連結串列和遞迴的同學都應該知道,在函式無限的呼叫自身函式會死迴圈,而頭尾相接的連結串列是完全合理可以存在的。

下一篇預告,上邊程式碼中不是缺了init的詳細程式碼麼,你懂得。。

相關推薦

Jquery 程式碼解析()—jquery物件

從今天開始讀Jquery原始碼,並開始解析原始碼的思路,記下來備忘。後邊會整理出一個完整的。 Write less,Do more!—Jquery理念 想必只要是學過前端,學過html+css+js這一套用來寫網頁的技術的人必然不能不知道大名鼎鼎的J

自動駕駛(): 自動駕駛架構解析

演進路線 整體架構 Apollo1.0 Apollo1.5 Apollo2.0 Apollo2.5 Apollo3.0 硬體部署 Apollo2.5 Apollo3.0 硬體連線 軟

小白的程式碼審計

一般框架中可訪問的方法都要求屬性為public並且方法名要符合命名規範才能被瀏覽器訪問到,在ThinkPHP中預設的規則要求就是隻要方法名為public就可以被訪問。(如SlightPHP中不僅需要方法為public,還需要方法名字首為page.具體可以參考各框架說明)。這樣我們就可以完美的定位檔案和方法了。

擼過程式碼,你看過這篇文章嗎?

---《構建之法》學習筆記5 北上廣深真的是技術的寶地嗎? ​ 猶記得剛剛參加工作之後,有人邀請我去深圳,說沿海地區是IT行業從業人員的寶地,只有在那裡才會學到真正的技術,而且能拿到更高的工資,不管從哪個層面來說,都值得你去看一看。然而當時的我並沒有聽信他的話,甚至還在想,網際網路是平的,只要你願意學習,哪裡

C#的初學(

ring 刪除字符 hello 劃線 num 開頭 nbsp ins 應用程序 1 .NET的框架(Framework):是整個開發平臺的基礎,包括公共語言運行庫和.NET類庫 2.C#的數據類型 按數據的存儲方式劃分,有值類型和引用類型. 值類型:(值類型變量存儲數據)

django celery的分布式異步() hello world

settings csrf trac 選擇 load 你在 函數 1.2 密碼 設想你遇到如下場景: 1)高並發 2)請求的執行相當消耗機器資源,流量峰值的時候可能超出單機界限 3)請求返回慢,客戶長時間等在頁面等待任務返回 4)存在耗時的定時任務 這時你就需要一個分布

[js高手]步步圖解javascript的原型(prototype)對象,原型鏈

create 原型對象 str 對象賦值 div blank type屬性 查找 __proto__ 我們接著上文繼續,我們通過原型方式,解決了多個實例的方法共享問題,接下來,我們就來搞清楚原型(prototype),原型鏈的來龍去脈. 1 functio

Spring Boot 成長() 快速上手

啟動引導 pom.xml relative 技術 build sans hot clas 1.2 1.創建工程 利用IntelliJ IDEA新建一個Spring Boot項目的Web工程 2.查看初始化的spring boot項目 工程建好之後會出現如下的目錄

scala學習

項目 前綴 .org 特質 行為 java字節碼 java 類繼承 對象 所謂學習,那麽首先就先簡單介紹一下scala吧 1.scala的介紹 Scala 是一門多範式(multi-paradigm)的編程語言,設計初衷是要集成面向對象編程和函數式編程的各種特性。 S

.Net Core學習()

日常 整體 get res 頁面 image setting 文字 body   前言:因為公司轉型需要,特地學習.NET Core。本來在我的計劃中.Net Core的學習應該沒有快就被執行的。一來是我想多補一點基礎和理論知識,再者就是我想攢點錢買臺好點的電腦再裝VS2

python 闖關(語法基礎)

英文 下劃線 .... 保存數據 bject 分用 alex 否則 變化 1,什麽是編程?為什麽要編程?   答:編程是個動詞,編程就等於寫代碼,那麽寫代碼是為了什麽呢?也就是為什麽要編程呢,肯定是為了讓計算機幫我們搞事情,代碼就是計算機能理解的語言。 2,編程語言進化史是

python,python基本語法

orm 一個 依次 條件 多語言 表示 都是 註意 方式 python基本語法: 1.python基本語句結構: 首先,在其他的語言中,比如java,c++,c#等,沒寫完一行語句之後,都需要在語句的末尾加一個分號,表示該語句結束,但是在python中,我們是不需要在每一行

視覺slam學習()看高翔十四講所遇到的問題

nes make 機器 cmake 編寫 直接 記錄 nbsp slam 目前實驗室做機器人,主要分三個方向,定位導航,建圖,圖像識別,之前做的也是做了下Qt上位機,後面又弄紅外識別,因為這學期上課也沒怎麽花時間在項目,然後導師讓我們確定一個方向來,便於以後發論文什麽

爬蟲開坑()

VG dia mage isp tex tro 需要 正式 ont 什麽是爬蟲   網絡爬蟲(web crawler),也叫網絡蜘蛛(spider),是一種用來自動瀏覽萬維網的網絡機器人(bots)。爬蟲是通過網頁的鏈接地址來尋找網頁,從網站某一個頁面開始,讀取網頁的內容

SpringCloud成長 註冊與發現(Eureka)

tail OS .so 註解 ont 基於 因此 AC spa 一、spring cloud簡介 spring cloud 為開發人員提供了快速構建分布式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分布式會話等等。它運行環境簡單

中大型網站架構

存儲 cache 查詢 動靜分離 面向服務 keepalive 網站 web 共享存儲 初期:   單臺服務器部署   web與數據庫獨立部署   動靜分離-初期   數據庫主從與查詢緩存   七層負負載均衡和共享存儲 中期:   數據庫架構擴展   soa面向服務器架構

數據結構與算法解析

++ blank 知識 black 復雜 根據 nbsp 教程 情況 數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法

Android框架原始碼解析)Volley

前幾天面試CVTE,HR面掛了。讓內部一個學長幫我查看了一下面試官評價,發現二面面試官的評價如下: 廣度OK,但缺乏深究能力,深度與實踐不足 原始碼:只能說流程,細節程式碼不清楚,retrofit和volley都是。 感覺自己一方面:自己面試技巧有待提高吧(框

python()

his pre utf-8 span pytho size 初識 file editor 初識python Hello,world. # -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script

java爬坑()——編譯可以正常編譯,執行時報unsupported major.minor version 52.0

寫了一個很簡單的helloworld,編譯可以正常編譯,執行時報unsupported major.minor version 52.0錯誤。 java程式碼如下: 用javac Hello.java命令編譯時,是沒有問題的,用java Hello執行時,怎麼也執行不了 後