最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript原型和原型鏈詳解

 更新時(shí)間:2024年05月24日 08:59:48   作者:程序員李林  
在面向?qū)ο蟮木幊陶Z(yǔ)言中,類(lèi)和對(duì)象的關(guān)系是鑄模和鑄件的關(guān)系,對(duì)象總是從類(lèi)創(chuàng)建而來(lái),比如Java中,必須先創(chuàng)建類(lèi)再基于類(lèi)實(shí)例化對(duì)象,這篇文章主要介紹了JavaScript原型和原型鏈的相關(guān)知識(shí),需要的朋友可以參考下

基于原型編程

在面向?qū)ο蟮木幊陶Z(yǔ)言中,類(lèi)和對(duì)象的關(guān)系是鑄模和鑄件的關(guān)系,對(duì)象總是從類(lèi)創(chuàng)建而來(lái),比如Java中,必須先創(chuàng)建類(lèi)再基于類(lèi)實(shí)例化對(duì)象。
而在基于原型編程的思想中,類(lèi)并不是必須的,對(duì)象都是通過(guò)克隆另外一個(gè)對(duì)象而來(lái),這個(gè)被克隆的對(duì)象就是原型對(duì)象。
基于原型編程的語(yǔ)言通常遵循下面的規(guī)則:

  • 所有的數(shù)據(jù)都是對(duì)象
  • 要得到一個(gè)對(duì)象,不是通過(guò)實(shí)例化類(lèi),而是找到一個(gè)對(duì)象作為原型并克隆它
  • 無(wú)法自己直接創(chuàng)建一個(gè)對(duì)象,對(duì)象都是克隆產(chǎn)生,必須有一個(gè)根對(duì)象,然后克隆它才可以創(chuàng)建對(duì)象
  • 對(duì)象會(huì)記住它的原型
  • 如果對(duì)象無(wú)法響應(yīng)某個(gè)請(qǐng)求,它會(huì)把這個(gè)請(qǐng)求委托給自己的原型

函數(shù)和對(duì)象

JavaScript是基于原型的語(yǔ)言,但JavaScript并非嚴(yán)格遵循原型編程的第一條規(guī)則,其中基本類(lèi)型undefined、number、string、boolean就不是對(duì)象,其模仿Java,分為了基本類(lèi)型和對(duì)象類(lèi)型,當(dāng)然和Java一樣,基本類(lèi)型可以使用包裝的形式變?yōu)閷?duì)象。
這里先探討一個(gè)問(wèn)題,有助于后面理解原型和原型鏈,那就是“所有的數(shù)據(jù)都是對(duì)象,函數(shù)也是對(duì)象“,雖然函數(shù)是對(duì)象,但是函數(shù)擁有很多普通對(duì)象不具備的特性:

  • 可執(zhí)行性:函數(shù)可以被調(diào)用執(zhí)行
  • 閉包:函數(shù)可以創(chuàng)建閉包
  • 構(gòu)造函數(shù):函數(shù)可以作為構(gòu)造函數(shù),去創(chuàng)建對(duì)象實(shí)例,理論上,除了 Object.create 創(chuàng)建的對(duì)象,都是通過(guò)構(gòu)造函數(shù)創(chuàng)建的對(duì)象。
  • 原型對(duì)象屬性:除了箭頭函數(shù),每個(gè)函數(shù)都有一個(gè) prototype 屬性,它是一個(gè)對(duì)象,用于存儲(chǔ)通過(guò)該構(gòu)造函數(shù)創(chuàng)建的所有實(shí)例的共享屬性和方法。

JavaScript原型

從上面可以得知,函數(shù)都有 prototype 屬性,稱(chēng)之為原型,也稱(chēng)為原型對(duì)象,原型對(duì)象里面可以存放屬性和方法,共享給實(shí)例對(duì)象使用,用于實(shí)現(xiàn)繼承效果。
這里的函數(shù)指的是構(gòu)造函數(shù),即可以通過(guò)new創(chuàng)建對(duì)象的函數(shù),在JavaScript中普通函數(shù)都可以是構(gòu)造函數(shù),除了箭頭函數(shù)。

箭頭函數(shù)沒(méi)有 prototype 屬性是為了保持它們的設(shè)計(jì)簡(jiǎn)潔性,避免與原型鏈相關(guān)的復(fù)雜性和潛在問(wèn)題。箭頭函數(shù)同時(shí)不能使用new實(shí)例化對(duì)象。如果你需要定義一個(gè)構(gòu)造器函數(shù),應(yīng)該使用普通函數(shù)而不是箭頭函數(shù)。

舉例說(shuō)明:

const arr = new Array(1, 2, 3)
arr.reverse()
arr.sort()

在上面的代碼中 Array 就是一個(gè)構(gòu)造函數(shù),reverse和sort都是 Array.prototype 原型對(duì)象上的函數(shù)。
這里有個(gè)問(wèn)題,為何要將這些方法放在 prototype 原型屬性上,而不是放在構(gòu)造函數(shù)內(nèi)部呢?
我們來(lái)看下面的代碼:

function Person() {
  this.getName = function () {
    console.log('person')
  }
}
Person.prototype.getProtoName = function () {
  console.log('proto person')
}
const person = new Person()
const person1 = new Person()
console.log(person.getName === person1.getName) // false
console.log(person.getProtoName === person1.getProtoName) // true

很明顯,雖然在實(shí)例化對(duì)象上都可以調(diào)用這些方法,但兩者有本質(zhì)的不同,將方法放在 prototype 原型對(duì)象上,之后實(shí)例化的對(duì)象使用的都是同一個(gè)方法,類(lèi)似于Java的類(lèi)方法,而構(gòu)造函數(shù)內(nèi)的方法,則會(huì)重新創(chuàng)建,也就是實(shí)例對(duì)象方法。

JavaScript原型鏈

了解完原型之后,再來(lái)看原型鏈就非常簡(jiǎn)單了。

  • 對(duì)象可以調(diào)用其構(gòu)造函數(shù)的 prototype 原型對(duì)象的屬性和方法
  • 原型對(duì)象也是對(duì)象,同樣也可以調(diào)用其構(gòu)造函數(shù)的prototype原型對(duì)象的屬性和方法
  • 一層一層的形成一條鏈路就是原型鏈

如圖所示:

解讀:

  • 在瀏覽器中,通常使用對(duì)象的 __proto__ 即可找到對(duì)象的原型對(duì)象,每個(gè)對(duì)象都有 __proto__ 屬性(還是要去除Object.create創(chuàng)建的),用于指向它的原型對(duì)象。
  • 前面基于原型編程有一個(gè)規(guī)則是,必須有一個(gè)根對(duì)象,JavaScript中根對(duì)象是:Object.prototype,其是一個(gè)空對(duì)象。

原型鏈經(jīng)典圖片

最后結(jié)合上面的內(nèi)容,來(lái)看看下面的經(jīng)典原型鏈圖:

從上圖可以看出左邊是實(shí)例對(duì)象,中間是構(gòu)造函數(shù),右邊是原型對(duì)象,圖中還包含了一些其它內(nèi)容:
函數(shù)是一個(gè)函數(shù),同時(shí)也是一個(gè)對(duì)象:
構(gòu)造函數(shù)作為一個(gè)函數(shù)時(shí),擁有原型對(duì)象屬性 prototype同時(shí)函數(shù)也是一個(gè)對(duì)象,函數(shù)都是由構(gòu)造函數(shù) Function 構(gòu)造出來(lái)的,包括 Function 函數(shù)本身,可以看上圖中 function Foo()、function Object()、function Function() 的 __proto__ 都是指向 Funtion.prototype,這是函數(shù)比較特殊的一點(diǎn)。
這個(gè)地方有點(diǎn)繞,再理一下,函數(shù)的 prototype 屬性是這個(gè)函數(shù)自己的屬性,而函數(shù)的 __proto__ 指向的是其構(gòu)造函數(shù)的原型對(duì)象,可以理解為父級(jí)的屬性,兩者是不同的。

總結(jié)

  • JavaScript是基于原型編程,創(chuàng)建對(duì)象是通過(guò)克隆對(duì)象的形式,不是通過(guò)類(lèi)創(chuàng)建。
  • 函數(shù)都擁有 prototype 原型屬性,實(shí)例化對(duì)象的 __proto__ 屬性指向這個(gè)原型屬性,對(duì)象可以直接調(diào)用原型對(duì)象的方法和屬性,不用寫(xiě) __proto__ 再調(diào)用,兩者效果一致。
  • 對(duì)象的 __proto__ 指向構(gòu)造函數(shù)的 prototype,構(gòu)造函數(shù)的 prototype 同樣是對(duì)象,其 __proto__ 指向上一層原型對(duì)象,直到 Object.prototype,形成原型鏈。

到此這篇關(guān)于JavaScript原型和原型鏈的文章就介紹到這了,更多相關(guān)JavaScript原型和原型鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javascript表格翻頁(yè)效果實(shí)現(xiàn)思路及代碼

    Javascript表格翻頁(yè)效果實(shí)現(xiàn)思路及代碼

    表格翻頁(yè)的實(shí)現(xiàn)方式有很多,下面以js為例為大家詳細(xì)介紹下表格翻頁(yè)效果的具體實(shí)現(xiàn),感興趣的朋友可以參考下
    2013-08-08
  • 前端常用加密方式及使用方法示例代碼

    前端常用加密方式及使用方法示例代碼

    隨著信息和數(shù)據(jù)安全重要性的日益凸顯,如何保證信息數(shù)據(jù)在傳輸?shù)倪^(guò)程中的安全成為開(kāi)發(fā)者重點(diǎn)關(guān)注的內(nèi)容,這篇文章主要介紹了前端常用加密方式及使用方法的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • uni-app小程序中父組件和子組件傳值的實(shí)現(xiàn)實(shí)例

    uni-app小程序中父組件和子組件傳值的實(shí)現(xiàn)實(shí)例

    uniapp父子組件引用傳值,和vue的一樣,沒(méi)有小程序那樣的麻煩,下面這篇文章主要給大家介紹了關(guān)于uni-app小程序中父組件和子組件傳值的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • javascript每日必學(xué)之條件分支

    javascript每日必學(xué)之條件分支

    javascript每日必學(xué)之條件分支,本文的主要內(nèi)容就是介紹的邏輯條件分支,循環(huán),感興趣的小伙伴們可以參考一下
    2016-02-02
  • JS實(shí)現(xiàn)光滑展開(kāi)合攏的菜單效果代碼

    JS實(shí)現(xiàn)光滑展開(kāi)合攏的菜單效果代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)光滑展開(kāi)合攏的菜單效果代碼,涉及JavaScript響應(yīng)鼠標(biāo)事件遍歷并改變頁(yè)面元素屬性的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • javascript實(shí)現(xiàn)無(wú)法關(guān)閉的彈框

    javascript實(shí)現(xiàn)無(wú)法關(guān)閉的彈框

    本文分享了javascript實(shí)現(xiàn)無(wú)法關(guān)閉的彈框的實(shí)例代碼,感興趣的朋友可以看下
    2016-11-11
  • 詳解jQuery事件

    詳解jQuery事件

    本文主要介紹了jQuery事件的相關(guān)知識(shí)。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • JS觸發(fā)服務(wù)器控件的單擊事件(詳解)

    JS觸發(fā)服務(wù)器控件的單擊事件(詳解)

    下面小編就為大家?guī)?lái)一篇JS觸發(fā)服務(wù)器控件的單擊事件(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • JavaScript數(shù)據(jù)可視化:ECharts制作地圖

    JavaScript數(shù)據(jù)可視化:ECharts制作地圖

    這篇文章主要介紹了Echarts實(shí)現(xiàn)可視化地圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 微信小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽

    微信小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)點(diǎn)擊圖片放大預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評(píng)論

福建省| 镇赉县| 乡宁县| 巴塘县| 贡山| 广饶县| 永登县| 石渠县| 汉中市| 武鸣县| 太谷县| 商城县| 察哈| 滨海县| 安泽县| 赤城县| 探索| 繁峙县| 巢湖市| 彭水| 周口市| 浦县| 富川| 哈密市| 三门峡市| 田阳县| 芦溪县| 黑龙江省| 叶城县| 开封市| 家居| 汶上县| 山阴县| 吉安县| 沅陵县| 陇南市| 庐江县| 聂拉木县| 资中县| 政和县| 曲阜市|