JavaScript中的原型prototype和__proto__的區(qū)別及原型鏈概念

問(wèn)題

初學(xué)js的同學(xué)驾胆,總是搞不清楚js中的原型是什么東西,看著控制臺(tái)打印出來(lái)的一串串__proto__跛锌,迷惑不已弃秆。

例如我定義一個(gè)Person,創(chuàng)建一個(gè)實(shí)例p髓帽,并打印實(shí)例菠赚。

function Person(){}
var p = new Person();
console.log(p)
在這里插入圖片描述

圖中,打印出來(lái)一個(gè)Person的實(shí)例對(duì)象p郑藏,
這個(gè)對(duì)象有個(gè)__proto__ 屬性衡查,這個(gè)是什么東西?
__proto__屬性下又有constructor屬性和__proto__屬性必盖。
constructor是什么拌牲,為什么打印結(jié)果是 Person()?
另外一個(gè)__proto__是什么歌粥?

為了解答上邊的問(wèn)題塌忽,我們需要了解一些相關(guān)概念。

一失驶、原型

prototype

首先土居,說(shuō)明一下,JS中,萬(wàn)物皆對(duì)象装盯。

每個(gè)函數(shù)對(duì)象都有一個(gè)屬性prototype(函數(shù)對(duì)象特有屬性)坷虑,這個(gè)屬性是一個(gè)引用,指向一個(gè)對(duì)象埂奈,這個(gè)對(duì)象的作用就是包含所有實(shí)例共享的屬性和方法迄损。我們把這個(gè)對(duì)象就叫做原型對(duì)象,也叫顯式原型账磺。

__proto__

每個(gè)對(duì)象都有一個(gè)屬性__proto__芹敌,也可稱為隱式原型,對(duì)象的隱式原型指向創(chuàng)建該對(duì)象的構(gòu)造函數(shù)的原型(prototype)垮抗。

constructor

函數(shù)的原型對(duì)象有一個(gè)constructor屬性氏捞,這個(gè)屬性是一個(gè)引用,用于指向原構(gòu)造函數(shù)冒版。

關(guān)系

我們?cè)趺蠢斫馍线叺母拍钜壕ィ鼈冎g又有什么聯(lián)系呢?

我們不妨打印出來(lái)p.__proto__屬性:


在這里插入圖片描述

可以看到辞嗡,打印出來(lái)是一個(gè)對(duì)象捆等,對(duì)象里邊有個(gè)屬性constructor。

constructor是什么呢续室,打印如下:


在這里插入圖片描述

可以看到栋烤,打印出來(lái)是函數(shù),代表的就是Person構(gòu)造函數(shù)本身.

再依次打印出來(lái)Person構(gòu)造函數(shù)的原型Person.prototype挺狰,
和其原型的屬性constructor:


在這里插入圖片描述

從上圖我們就可以得出:

1.實(shí)例對(duì)象p有屬性__proto__ 指向的就是創(chuàng)建它的構(gòu)造函數(shù)的原型對(duì)象Person.prototype明郭。
2.構(gòu)造函數(shù)的原型對(duì)象Person.prototype的屬性constructor指向Person構(gòu)造函數(shù)本身。

我們可以驗(yàn)證一下:


在這里插入圖片描述

但是丰泊,可能又有些同學(xué)有疑惑了薯定,那既然所有對(duì)象都有__proto__屬性,
那構(gòu)造函數(shù)Person()的屬性__proto__指向誰(shuí)呢趁耗?
當(dāng)然是指向它的構(gòu)造函數(shù)的原型對(duì)象了沉唠。
函數(shù)的構(gòu)造函數(shù)就是Function(),因此這里的__proto__指向Function.prototype苛败。

那原型對(duì)象也是對(duì)象满葛,它的__proto__屬性指向誰(shuí)呢?
同理,指向它的構(gòu)造函數(shù)的原型對(duì)象罢屈,即Object.prototype嘀韧。

這里,我們就不得不提一下缠捌,原型鏈的概念了锄贷。

原型鏈

原型鏈?zhǔn)且环N機(jī)制译蒂,指的是js中,每個(gè)對(duì)象都有一個(gè)屬性__proto__谊却,指向它的構(gòu)造函數(shù)的原型對(duì)象柔昼。原型對(duì)象也是一個(gè)對(duì)象,因此也有__proto__屬性指向原型對(duì)象的原型對(duì)象炎辨,這樣一層層向上直到對(duì)象的原型對(duì)象為空(Object的原型對(duì)象Object.prototpye的屬性__proto__為null)捕透。

因此,例子中原型鏈的關(guān)系如下:
p.__proto__ 指向 Person.prototype碴萧,
Person.prototype.__proto__指向的就是Object.prototype乙嘀,
Object.prototpye.__proto__ 指向null

為了理解上邊例子的原型鏈關(guān)系,我們畫一張圖來(lái)增加理解:

在這里插入圖片描述

至此破喻,上邊的問(wèn)題是不是心里已經(jīng)有答案了呢虎谢。

總結(jié)

1.每個(gè)對(duì)象都有一個(gè)__proto__屬性,指向創(chuàng)建它的構(gòu)造函數(shù)的原型對(duì)象曹质。
作用:構(gòu)成原型鏈婴噩,用于實(shí)現(xiàn)基于原型的繼承。
2.函數(shù)除了有__proto__屬性羽德,還有一個(gè)prototype屬性讳推,用來(lái)指向函數(shù)的原型對(duì)象。
作用:用于實(shí)現(xiàn)基于原型的繼承和屬性共享玩般。
因此,你會(huì)在很多地方見(jiàn)到有類似這樣的寫法:

function Person(){}
Person.prototype.hello = function(){
    console.log("hello")
}

上邊代碼表示礼饱,所有Person創(chuàng)建的實(shí)例對(duì)象都可以共享hello方法坏为。
3.構(gòu)造函數(shù)的原型對(duì)象有屬性constructor,指向構(gòu)造函數(shù)本身镊绪。

PS:歡迎關(guān)注公眾號(hào):「如若清風(fēng)」匀伏,一起交流學(xué)習(xí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝴韭,一起剝皮案震驚了整個(gè)濱河市够颠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榄鉴,老刑警劉巖履磨,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異庆尘,居然都是意外死亡剃诅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門驶忌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)矛辕,“玉大人,你說(shuō)我怎么就攤上這事×钠罚” “怎么了飞蹂?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)翻屈。 經(jīng)常有香客問(wèn)我陈哑,道長(zhǎng),這世上最難降的妖魔是什么妖胀? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任芥颈,我火速辦了婚禮,結(jié)果婚禮上赚抡,老公的妹妹穿的比我還像新娘爬坑。我一直安慰自己,他們只是感情好涂臣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布盾计。 她就那樣靜靜地躺著,像睡著了一般赁遗。 火紅的嫁衣襯著肌膚如雪署辉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天岩四,我揣著相機(jī)與錄音哭尝,去河邊找鬼。 笑死剖煌,一個(gè)胖子當(dāng)著我的面吹牛材鹦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耕姊,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼桶唐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了茉兰?” 一聲冷哼從身側(cè)響起尤泽,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎规脸,沒(méi)想到半個(gè)月后坯约,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莫鸭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年鬼店,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黔龟。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妇智,死狀恐怖滥玷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巍棱,我是刑警寧澤惑畴,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站航徙,受9級(jí)特大地震影響如贷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜到踏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窝稿。 院中可真熱鬧,春花似錦伴榔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至援奢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間集漾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工帆竹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脓规。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓栽连,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親秒紧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容