主頁 > 企業開發 > 深入原型鏈與繼承(詳解JS繼承原理)

深入原型鏈與繼承(詳解JS繼承原理)

2022-12-23 07:13:06 企業開發

目錄
  • 原型鏈與繼承
    • new 關鍵字的執行程序
    • 建構式、實體物件和原型物件
    • 原型鏈的概念及圖解
      • 第一層__proto__指向:實體物件
      • 第二層__proto__指向:Function.prototypeFoo.prototype
      • 第三層__proto__指向:Object.prototype
    • 原型鏈繼承
    • 盜用建構式
    • 組合繼承( = 原型鏈繼承 + 盜用建構式 )
    • 原型繼承
    • 寄生繼承
    • 寄生組合繼承( = 組合繼承 + 原型繼承 + 寄生繼承 )
    • class繼承(ES6 語法)( ≈ 寄生組合繼承 )

原型鏈與繼承


new 關鍵字的執行程序

讓我們回顧一下,this 指向里提到的new關鍵字執行程序,

  1. 創建一個新的空物件
  2. 將建構式的原型賦給新創建物件(實體)的隱式原型
  3. 利用顯式系結將建構式的 this 系結到新創建物件并為其添加屬性
  4. 回傳這個物件

手寫new關鍵字的執行程序:

function myNew(fn, ...args) { // 建構式作為引數
    let obj = {}
    obj.__proto__ = fn.prototype
    fn.apply(obj, args)
    return obj
}

這里提到了__proto__ prototype:前者被稱為隱式原型,后者被稱為顯式原型


建構式、實體物件和原型物件

三者的概念

建構式:用于生成實體物件,建構式可分為兩類:

  • 自定義建構式:function foo () {}
  • 原生建構式:function Function () {}function Object () {}

原型物件:每個建構式都有自己的原型物件,可通過prototype訪問,

實體物件:可由建構式通過new關鍵字生成的物件,

三者的關系

建構式可以通過prototype訪問其原型物件,而原型物件可通過constructor訪問其建構式,建構式可通過new關鍵字創建實體物件,實體物件可通過__proto__ 訪問其原型物件,

我們來看一段代碼的輸出結果:

function Foo(name, age) {
    this.name = name
    this.age = age
}
let a = new Foo('小明', 22)
console.log('建構式:', Foo)
console.log('原型物件', Foo.prototype)
console.log('實體物件', a)
// 可以輸出一下,看看它們都是什么樣子

可以看出實體物件內部的第一個[[Prototype]]的展開內容等于原型物件的展開內容,可構建一個等式如下:

// 實體物件可通過 __proto__ 訪問其原型物件
a.__proto__ === Foo.prototype // true
// 原型物件可通過 constructor 訪問其建構式
Foo.prototype.constructor === Foo // true

原型鏈的概念及圖解

來看一張關于原型鏈的經典圖:

上面這張圖的箭頭乍一看能讓人頭疼,我們對圖中的元素進行分類并劃分層次,可有以下三層:

第一層__proto__指向:實體物件

  1. 通過建構式生成的實體物件
// 生成實體物件
function Foo() {}
let obj1 = new Foo()

// __proto__指向驗證
obj1.__proto__ === Foo.prototype // true
  1. 通過new Object()物件字面量生成的實體物件
// 生成實體物件
let obj2 = new Object()

// __proto__指向驗證
obj2.__proto__ === Object.prototype // true
  1. 通過functionclass宣告生成的實體物件
// 生成實體物件
function Foo(){}
// 原生建構式
// function Function(){}
// function Object(){}

// __proto__指向驗證
Foo.__proto__ === Function.prototype // true
Function.__proto__ === Function.prototype // true
Object.__proto__ === Function.prototype // true

說明:其實我們自己定義的函式也是由Function建構式生成的實體物件,

第二層__proto__指向:Function.prototypeFoo.prototype

Foo.prototype.__proto__ === Object.prototype // true

Function.prototype.__proto__ === Object.prototype // true

第三層__proto__指向:Object.prototype

Object.prototype.__proto__ === null // true

我們自己再畫一張圖看一下:

自底向上有三層的__proto__構成基本的JavaScript原型模式生態,最后再總結一下規則:

  1. 實體物件都會指向其建構式原型
  2. 建構式原型都會指向Object.prototype
  3. Object.prototype最終指向null

總結:其實我們的原型鏈指的就是__proto__的路徑,

注意:這里只是為了原型鏈能更加直觀,請不要忘了建構式原型的constructor屬性,它會指回對應的建構式,


原型鏈繼承

我們利用任務驅動型的方法去學習繼承方式,考慮這樣一個類結構:

  1. 普通用戶:作為父類
  2. VIP 用戶:作為子類

說明:VIP用戶需要繼承普通用戶,其中,VIP用戶的武器串列可以添加屠龍寶刀,

原型鏈搜索機制:若要訪問當前物件所沒有的屬性和方法,則會首先以當前物件為起點沿著原型鏈__proto__向上尋找每個物件內部的屬性和方法,直到找到對應的屬性和方法,沒有則會直接走到原型鏈盡頭null

來看這樣一段代碼:

function USER(username, password) {
    this.username = username
    this.password = password
    this.weapon = ['水果小刀']
}

VIP.prototype = new USER() // 為什么要放到中間?
// 注意:改寫原型,要記得把 constructor 指會原建構式
VIP.prototype.constructor = VIP

function VIP() { }
VIP.prototype.addWeapon = function (weaponName) {
    this.weapon.push(weaponName)
}

let a = new VIP('小明')
// 缺陷1:無法給父類建構式傳參,只能在 VIP 中自行添加相應引數,無法實作父類屬性重用

let b = new VIP()
b.addWeapon('屠龍寶刀')
console.log(b.weapon)

let c = new VIP()
console.log(c.weapon)
// 缺陷2: 我們想要單獨給實體 b 的武器串列添加一把屠龍寶刀,結果是實體 c 的武器串列也會增加屠龍寶刀

原型鏈__proto__實作繼承會經過的物件(從子類實體到父類原型):

  1. 子類建構式實體 :new VIP()

  2. 父類建構式實體new USER()

  3. 父類建構式原型 :USER.prototype

我們可以構建兩個運算式去驗證:

new VIP().__proto__ === new USER() // true
new USER().__proto__ === USER.prototype // true

再進一步提煉以上兩個運算式,可獲得最終運算式,以下為實作繼承關鍵的完整原型鏈:

// VIP 建構式所生成的實體會經過兩層__proto__找到父類原型
new VIP().__proto__.__proto__ === USER.prototype
// 接下來,由 VIP 建構式生成的實體所沒有的屬性和方法,都會去父類原型找到屬性和方法,

原型鏈繼承缺點:

  1. 父類原型中若存在的參考值則會在所有實體間共享,
  2. 子類建構式在實體化時不能給父類建構式傳參,即我們的父類屬性無法重用,

為什么 VIP.prototype = new USER() 這一步要放到兩個建構式中間?

如果這一步運算式放到后面,我們的VIP.prototype是其原本建構式 VIP 的原型,在這個原本的建構式原型上添加方法,不會有繼承效果,

我們的想法是通過父類建構式生成實體,利用它實體的__proto__去實作繼承效果,要想在子類建構式添加方法,我們實際做了這樣的操作,如下:

// new USER()就是我們父類建構式生成的實體
new USER().addWeapon = function (weaponName) {
    this.weapon.push(weaponName)
}

但是上面這樣會出現問題,我們子類建構式怎么辦?他想new一個實體,還是會根據原來的原型,

因此,我們需要將new USER()傳遞給VIP.prototype,這樣VIP建構式生成實體才會有繼承效果,如下:

VIP.prototype = new USER() // 傳遞__proto__實作繼承

VIP.prototype.addWeapon = function (weaponName) {
    this.weapon.push(weaponName)
}

盜用建構式

來看這樣一段代碼:

function USER(username, password) {
    this.username = username
    this.password = password
    this.weapon = ['水果小刀']
}

function VIP(username, password) {
    USER.call(this, username, password) // 呼叫父類建構式,為其屬性賦值
} // 這里的 this 指向子類建構式生成的新實體

// 1. 接下來我們可以向父類建構式傳參
let a = new VIP('小紅')
console.log(a.username) // 小紅

// 2. 也可以解決參考值產生的問題
let b = new VIP()
b.weapon.push('屠龍寶刀')
console.log(b.weapon) // ['水果小刀', '屠龍寶刀']

let c = new VIP()
console.log(c.weapon) // ['水果小刀']
// 這樣實體 b 和 c 的武器串列的資料都是獨立的

程序決議:new VIP('小紅')傳入了一個“小紅”引數,

第一次系結操作new執行程序會執行一次系結操作,將this指向實體物件,

第二次系結操作:VIP建構式內部的call方法再次系結實體物件,呼叫父類建構式

總結:我們通過傳參實際呼叫了兩次系結操作,最終使得子類建構式的新實體也能擁有父類的屬性和值,

盜用建構式缺點:

  1. 只能在建構式內部定義方法使用,不能訪問父類原型定義的方法,即我們的父類方法不能重用

組合繼承( = 原型鏈繼承 + 盜用建構式 )

如果你已經清楚的知道上面兩種繼承方式的優點和缺陷,那么我們可以利用1 + 1 > 2 的方法實作組合繼承,

function USER(username, password) {
    this.username = username
    this.password = password
    this.weapon = ['水果小刀']
}

VIP.prototype = new USER()
// 注意:改寫原型,要記得把 constructor 指會原建構式
VIP.prototype.constructor = VIP

function VIP(username, password) {
    USER.call(this, username, password) // 呼叫父類建構式,為其屬性賦值
} // 這里的 this 指向子類建構式生成的新實體
VIP.prototype.addWeapon = function (weaponName) {
    this.weapon.push(weaponName)
}

// 我們嘗試給父類建構式傳參
let a = new VIP('小紅')
console.log(a.username) // 小紅

// 看看添加屠龍寶刀,有沒有相互影響
let b = new VIP()
b.addWeapon('屠龍寶刀')
console.log(b.weapon)

let c = new VIP()
console.log(c.weapon)

以上的組合繼承方式輸出了正確的答案,算是完美解決了原型鏈繼承和盜用建構式繼承出現的問題,我們將以上代碼放入瀏覽器打斷點分析,如下:

很明顯,我們第一次new USER()會呼叫父類建構式,而后子類建構式每一次生成新實體都會呼叫父類建構式,也就是說,多了第一次會呼叫父類建構式的情況,


原型繼承

在 JavaScirpt 高級程式設計 8.3.4 中提到了這種方式,來看這樣一段代碼

function object(obj) {
    function Fn() { }
    Fn.prototype = obj
    return new Fn() // 回傳一個空函式,其內部原型改寫為 obj
}

有沒有熟悉的感覺,其實正是我們之前手寫bind函式利用的繼承方法,與ES6中的Object.create()方法效果相同,它適于在原有物件的基礎上再克隆一個物件,此外,物件屬性值若為原始值則可以進行改寫,若為參考值則會產生參考值的特點,即多個克隆物件會共享同一個參考值,也就是說這個“克隆”操作相當于我們的淺拷貝操作,


寄生繼承

function createAnother(obj) {
    let clone = object(obj)
    clone.sayHello = () => {
        console.log('Hello World')
    }
}

這種方式可以使克隆物件在原基礎上增強,即添加屬性和方法,

注意:原型繼承和寄生繼承都重點關注物件的使用,而不考慮建構式的使用


寄生組合繼承( = 組合繼承 + 原型繼承 + 寄生繼承 )

我們可以再利用瀏覽器打斷點試試,是不是不會發生像組合繼承那樣首次呼叫建構式的情況,

// 寄生組合繼承
function inheritPrototype(subType, superType) {
    subType.prototype = Object.create(superType.prototype) // 創建物件
    subType.prototype.constructor = subType // 增強物件
}

function USER(username, password) {
    this.username = username
    this.password = password
    this.weapon = ['水果小刀']
}

// 驗證運算式時,下面這一條陳述句要加上注釋,
inheritPrototype(VIP, USER) // 呼叫繼承函式,

// 驗證運算式時,把下面這兩條陳述句注釋去掉,
// VIP.prototype = Object.create(USER.prototype) // 創建物件
// VIP.prototype.constructor = VIP // 增強物件

function VIP(username, password) {
    USER.call(this, username, password) // 呼叫父類建構式,為其屬性賦值
} // 這里的 this 指向子類建構式生成的新實體
VIP.prototype.addWeapon = function (weaponName) {
    this.weapon.push(weaponName)
}

// 我們嘗試給父類建構式傳參
let a = new VIP('小紅')
console.log(a.username) // 小紅

// 看看添加屠龍寶刀,有沒有相互影響
let b = new VIP()
b.addWeapon('屠龍寶刀')
console.log(b.weapon)

let c = new VIP()
console.log(c.weapon)

原型鏈__proto__實作繼承會經過的物件(從子類實體到父類原型):

  1. 子類建構式實體 :new VIP()
  2. 空建構式實體Object.create(USER.prototype)
  3. 父類建構式原型 :USER.prototype

我們同樣構建兩個運算式去驗證:

new VIP().__proto__ === Object.create(USER.prototype) // true
Object.create(USER.prototype).__proto__ === USER.prototype // true

再進一步提煉以上兩個運算式,可獲得最終運算式,以下為實作繼承關鍵的完整原型鏈:

new VIP().__proto__.__proto__ === USER.prototype // true
// 接下來,由 VIP 建構式生成的實體所沒有的屬性和方法,都會去父類原型找到屬性和方法,

原型鏈和寄生組合的繼承區別比較

原型鏈的繼承實作:利用new USER()作為跳板實作繼承,

VIP.prototype = new USER() // 傳遞__proto__實作繼承
new VIP().__proto__ === new USER() // true
new USER().__proto__ === USER.prototype // true

寄生組合的繼承實作:利用Object.create(USER.prototype)作為跳板實作繼承,

VIP.prototype = Object.create(USER.prototype) // 傳遞__proto__實作繼承
new VIP().__proto__ === Object.create(USER.prototype) // true
Object.create(USER.prototype).__proto__ === USER.prototype // true

注意:Object.create(USER.prototype)會回傳一個空函式實體,這個實體的__proro__指向USER()建構式,


class繼承(ES6 語法)( ≈ 寄生組合繼承 )

在 ES5 之前我們都是利用建構式實作面向物件編程,ES6 的class作為語法糖,其實內部也是利用了建構式實作面向物件編程,

class USER {
    constructor(username, password) {
        this.username = username
        this.password = password
        this.weapon = ['水果小刀']
    }
}
class VIP extends USER {
    constructor(username, password) {
        super(username, password) // 呼叫父類建構式,相當于執行 call 方法
    }
    addWeapon(weaponName) {
        this.weapon.push(weaponName)
    }
}

// 我們嘗試給父類建構式傳參
let a = new VIP('小紅')
console.log(a.username) // 小紅

// 看看添加屠龍寶刀,有沒有相互影響
let b = new VIP()
b.addWeapon('屠龍寶刀')
console.log(b.weapon)

let c = new VIP()
console.log(c.weapon)

// 以上同樣可運行我們的測驗代碼

總結 JavaScript 繼承方式:

  1. 原型鏈繼承
  2. 盜用建構式繼承
  3. 組合繼承( = 原型鏈繼承 + 盜用建構式 )
  4. 原型式繼承
  5. 寄生繼承
  6. 寄生組合繼承( = 組合繼承 + 原型繼承 + 寄生繼承 )
  7. class繼承( ≈ 寄生組合繼承 )

以上可以看出 JavaScript 對與繼承方式的優化是一個多次迭代不斷優化的程序,


參考

JavaScript高級程式設計(第4版)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/540553.html

標籤:其他

上一篇:Visual Studio Code 安裝教程

下一篇:教你用JavaScript獲取大轉盤

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more