亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

詳解幫你徹底搞懂JS中的prototype、__proto__與constructor(圖解)

2024-05-06 16:54:30
字體:
來源:轉載
供稿:網友

提示:不要排斥,靜下心來,認真讀完,你就搞懂了!(可以先看一下最后的總結部分再回過頭來完整看完)

1. 前言

作為一名前端工程師,必須搞懂JS中的prototype、__proto__constructor屬性,相信很多初學者對這些屬性存在許多困惑,容易把它們混淆,本文旨在幫助大家理清它們之間的關系并徹底搞懂它們。這里說明一點,__proto__屬性的兩邊是各由兩個下劃線構成(這里為了方便大家看清,在兩下劃線之間加入了一個空格:_ _proto_ _),實際上,該屬性在ES標準定義中的名字應該是[[Prototype]],具體實現是由瀏覽器代理自己實現,谷歌瀏覽器的實現就是將[[Prototype]]命名為__proto__,大家清楚這個標準定義與具體實現的區別即可(名字有所差異,功能是一樣的)。本文基于谷歌瀏覽器(版本 72.0.3626.121)的實驗結果所得。

現在正式開始! 讓我們從如下一個簡單的例子展開討論,并配以相關的圖幫助理解:

function Foo() {...};let f1 = new Foo();

以上代碼表示創建一個構造函數Foo(),并用new關鍵字實例化該構造函數得到一個實例化對象f1。這里稍微補充一下new操作符將函數作為構造器進行調用時的過程:函數被調用,然后新創建一個對象,并且成了函數的上下文(也就是此時函數內部的this是指向該新創建的對象,這意味著我們可以在構造器函數內部通過this參數初始化值),最后返回該新對象的引用。雖然是簡簡單單的兩行代碼,然而它們背后的關系卻是錯綜復雜的,如下圖所示:

JS,prototype,__proto__,constructor

看到這圖別怕,讓我們一步步剖析,徹底搞懂它們!

圖的說明:右下角為圖例,紅色箭頭表示__proto__屬性指向、綠色箭頭表示prototype屬性的指向、棕色實線箭頭表示本身具有的constructor屬性的指向,棕色虛線箭頭表示繼承而來的constructor屬性的指向;藍色方塊表示對象,淺綠色方塊表示函數(這里為了更好看清,Foo()僅代表是函數,并不是指執行函數Foo后得到的結果,圖中的其他函數同理)。圖的中間部分即為它們之間的聯系,圖的最左邊即為例子代碼。

2. _ _ proto _ _ 屬性

首先,我們需要牢記兩點:①__proto__constructor屬性是對象所獨有的;② prototype屬性是函數所獨有的。但是由于JS中函數也是一種對象,所以函數也擁有__proto__constructor屬性,這點是致使我們產生困惑的很大原因之一。上圖有點復雜,我們把它按照屬性分別拆開,然后進行分析:

JS,prototype,__proto__,constructor  

第一,這里我們僅留下 __proto__ 屬性,它是對象所獨有的,可以看到__proto__屬性都是由一個對象指向一個對象,即指向它們的原型對象(也可以理解為父對象),那么這個屬性的作用是什么呢?它的作用就是當訪問一個對象的屬性時,如果該對象內部不存在這個屬性,那么就會去它的__proto__屬性所指向的那個對象(可以理解為父對象)里找,如果父對象也不存在這個屬性,則繼續往父對象的__proto__屬性所指向的那個對象(可以理解為爺爺對象)里找,如果還沒找到,則繼續往上找…直到原型鏈頂端null(可以理解為原始人。。。),再往上找就相當于在null上取值,會報錯(可以理解為,再往上就已經不是“人”的范疇了,找不到了,到此結束,null為原型鏈的終點),由以上這種通過__proto__屬性來連接對象直到null的一條鏈即為我們所謂的原型鏈。

3. prototype屬性

第二,接下來我們看 prototype 屬性:

JS,prototype,__proto__,constructor

prototype屬性,別忘了一點,就是我們前面提到要牢記的兩點中的第二點,它是函數所獨有的,它是從一個函數指向一個對象。它的含義是函數的原型對象,也就是這個函數(其實所有函數都可以作為構造函數)所創建的實例的原型對象,由此可知:f1.__proto__ === Foo.prototype,它們兩個完全一樣。那prototype屬性的作用又是什么呢?它的作用就是包含可以由特定類型的所有實例共享的屬性和方法,也就是讓該函數所實例化的對象們都可以找到公用的屬性和方法。任何函數在創建的時候,其實會默認同時創建該函數的prototype對象。

4. constructor屬性

最后,我們來看一下 constructor 屬性:

JS,prototype,__proto__,constructor  

constructor屬性也是對象才擁有的,它是從一個對象指向一個函數,含義就是指向該對象的構造函數,每個對象都有構造函數(本身擁有或繼承而來,繼承而來的要結合__proto__屬性查看會更清楚點,如下圖所示),從上圖中可以看出Function這個對象比較特殊,它的構造函數就是它自己(因為Function可以看成是一個函數,也可以是一個對象),所有函數和對象最終都是由Function構造函數得來,所以constructor屬性的終點就是Function這個函數。

JS,prototype,__proto__,constructor

感謝網友的指出,這里解釋一下上段中“每個對象都有構造函數”這句話。這里的意思是每個對象都可以找到其對應的constructor,因為創建對象的前提是需要有constructor,而這個constructor可能是對象自己本身顯式定義的或者通過__proto__在原型鏈中找到的。而單從constructor這個屬性來講,只有prototype對象才有。每個函數在創建的時候,JS會同時創建一個該函數對應的prototype對象,而函數創建的對象.__proto__ === 該函數.prototype,該函數.prototype.constructor===該函數本身,故通過函數創建的對象即使自己沒有constructor屬性,它也能通過__proto__找到對應的constructor,所以任何對象最終都可以找到其構造函數(null如果當成對象的話,將null除外)。如下:

JS,prototype,__proto__,constructor

5. 總結

總結一下:

  • 我們需要牢記兩點:①__proto__constructor屬性是對象所獨有的;② prototype屬性是函數所獨有的,因為函數也是一種對象,所以函數也擁有__proto__constructor屬性。
  • __proto__屬性的作用就是當訪問一個對象的屬性時,如果該對象內部不存在這個屬性,那么就會去它的__proto__屬性所指向的那個對象(父對象)里找,一直找,直到__proto__屬性的終點null,再往上找就相當于在null上取值,會報錯。通過__proto__屬性將對象連接起來的這條鏈路即我們所謂的原型鏈。
  • prototype屬性的作用就是讓該函數所實例化的對象們都可以找到公用的屬性和方法,即f1.__proto__ === Foo.prototype。
  • constructor屬性的含義就是指向該對象的構造函數,所有函數(此時看成對象了)最終的構造函數都指向Function。

本文就此結束了,希望對那些對JS中的prototype、__proto__constructor屬性有困惑的同學有所幫助。

最后,感謝這兩篇博文,本文中的部分內容參考自這兩篇博文:
https://www.cnblogs.com/xiaohuochai/p/5721552.html
https://www.cnblogs.com/Narcotic/p/6899088.html

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。

若對你有幫助,可以支持一下作者創作更多好文章哦~
一分錢也是愛~
JS,prototype,__proto__,constructor


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合小说区| 国内精品久久影院| 亚洲自拍偷拍一区| 91精品在线观看视频| 亚洲肉体裸体xxxx137| 国产精品视频男人的天堂| 2019av中文字幕| 日韩专区在线观看| 欧美特级www| 国产美女精彩久久| 日韩电影免费观看在线观看| 日本精品视频在线播放| 欧美日韩精品在线观看| 日韩国产在线看| 色伦专区97中文字幕| 国产丝袜精品视频| 欧美性感美女h网站在线观看免费| 91地址最新发布| 日本高清不卡在线| 成人黄色午夜影院| 亚洲成avwww人| 欧美成人激情视频| 国产精品一区二区三区在线播放| 欧美成人免费大片| 亚洲男人天堂久| 日韩一二三在线视频播| 日韩精品免费一线在线观看| 国产va免费精品高清在线观看| 91网站免费看| 69久久夜色精品国产7777| 亚洲人成电影网站色www| 欧美一级免费看| 欧美性极品xxxx做受| 日韩av在线播放资源| 91精品久久久久久综合乱菊| 欧美精品生活片| 国产一区二区三区高清在线观看| 国产精品99导航| 国产精品一区二区3区| 国产91精品黑色丝袜高跟鞋| 国产日韩在线免费| 国产一区二区丝袜高跟鞋图片| 久久久亚洲国产| 深夜福利亚洲导航| 国产精品扒开腿做| 欧美大尺度在线观看| 精品人伦一区二区三区蜜桃网站| 国产亚洲精品久久久久久777| 欧美一级大片在线免费观看| 91久久精品国产| 国产精品视频资源| 精品无人区乱码1区2区3区在线| 欧美成人精品一区二区三区| 国产精品美女免费看| 日韩av手机在线| 北条麻妃在线一区二区| 日韩精品中文在线观看| 黄色一区二区在线| 国产一区二区三区视频在线观看| 欧美日韩国产成人高清视频| 欧美精品在线播放| 中文字幕成人精品久久不卡| 色婷婷av一区二区三区在线观看| 国产精品久久久久久一区二区| 久久不射电影网| 精品一区二区三区三区| 国产欧美精品日韩| 91av视频导航| 91免费人成网站在线观看18| 国产精品日韩在线播放| 国产香蕉精品视频一区二区三区| 久久久久久久久久av| 日本欧美黄网站| 久久综合伊人77777蜜臀| 久久久极品av| 成人伊人精品色xxxx视频| 成人中文字幕+乱码+中文字幕| 久久久久久久久久婷婷| 久久伊人91精品综合网站| 欧美黑人极品猛少妇色xxxxx| 国产+成+人+亚洲欧洲| 亚洲天堂男人的天堂| 成人激情视频小说免费下载| 欧美黄色片免费观看| 成人国产精品一区二区| 97精品一区二区三区| 福利二区91精品bt7086| 欧美另类在线播放| 欧美在线免费视频| 亚洲一区二区三区成人在线视频精品| 欧美一乱一性一交一视频| 欧美电影院免费观看| 国精产品一区一区三区有限在线| 国产精品美女主播在线观看纯欲| 高清一区二区三区四区五区| 亚洲影视中文字幕| 最新中文字幕亚洲| 欧美中文在线观看国产| 精品久久香蕉国产线看观看亚洲| 国产精品视频区1| 日韩视频在线免费| 青草青草久热精品视频在线观看| 日韩www在线| 中文字幕亚洲情99在线| 久久久黄色av| 国产成人精品一区| 最新日韩中文字幕| 午夜精品久久久久久久久久久久久| 亚洲图片欧美日产| 51视频国产精品一区二区| 黑人巨大精品欧美一区二区免费| 久久人人爽人人爽爽久久| 日日狠狠久久偷偷四色综合免费| 欧美日韩性视频| 91精品成人久久| 中文字幕成人在线| 欧美一级视频在线观看| 亚洲全黄一级网站| 亚洲午夜未满十八勿入免费观看全集| 亚洲精品视频播放| 欧美成人性色生活仑片| 国产亚洲精品成人av久久ww| 国产精品私拍pans大尺度在线| 欧美电影免费看| 国产福利视频一区| 亚洲自拍中文字幕| 美女精品久久久| 奇米四色中文综合久久| 成人性生交大片免费看视频直播| 精品动漫一区二区| 午夜精品久久久久久99热软件| 欧美中文在线观看| 在线观看欧美www| 国产精品久久久久久亚洲调教| 久久久久久欧美| 免费不卡欧美自拍视频| 日韩成人中文电影| 久久综合免费视频影院| 91av在线免费观看| 日韩hd视频在线观看| 亚洲美女视频网站| 欧美精品videos性欧美| 亚洲福利视频久久| 亚洲欧美成人精品| 久久亚洲精品中文字幕冲田杏梨| 日韩精品高清在线观看| 欧美日韩成人在线视频| 亚洲免费人成在线视频观看| 欧美日韩国产二区| 久久天天躁狠狠躁夜夜躁| 亚洲白虎美女被爆操| 日本精品久久电影| 欧美片一区二区三区| 欧美精品少妇videofree| 亚洲欧美一区二区三区情侣bbw| 中文字幕精品一区二区精品| 欧美中文在线观看国产| 日韩精品视频在线播放| www.亚洲免费视频| 久久久精品国产| 人体精品一二三区| 日韩av色综合| 日韩精品有码在线观看| 亚洲欧洲国产一区|