【四】原型鏈

本篇章主要講述原型鏈相關(guān)知識點(diǎn),為后續(xù)的函數(shù)篇章先鋪墊一定的前綴知識,也承接了引用類型篇章的知識。
面試回答
1.原型鏈:原型鏈主要有三部分構(gòu)成:原型、構(gòu)造函數(shù)、實(shí)例,實(shí)例可以通過new構(gòu)造函數(shù)獲取,構(gòu)造函數(shù)可以通過實(shí)例的constructor或者原型的constructor獲取,原型可以通過實(shí)例的
__proto__
或者構(gòu)造函數(shù)的prototype獲取。原型也可以通過__proto__
獲取父級元素的原型,直到最終拿到null。
知識點(diǎn)
1.原型鏈

圖片為我對于原型鏈的理解,一起讓我們由易入難去理解,原型鏈中的三個主體:原型、構(gòu)造函數(shù)、實(shí)例對象。
原型
可以簡單理解為儲存方法和屬性的對象(JS萬物皆可為對象)
構(gòu)造函數(shù)
只要被new過的函數(shù)就可以被稱為構(gòu)造函數(shù),每個函數(shù)都有一個prototype屬性,它指向該函數(shù)的原型,構(gòu)造函數(shù)也是如此。構(gòu)造函數(shù)里有兩個特殊的存在:Object、Function,前者在所有的JS對象的原型鏈上,后者則是所有的構(gòu)造函數(shù)(包括它自己)的都是Function的實(shí)例對象,所以
實(shí)例對象
由于不同的創(chuàng)建方式有差異,因此從創(chuàng)建方式來理解,一個為字面量方式;一個為構(gòu)造器方式;一個為Object.create方式。三者的差異在于不同的創(chuàng)建方式的原型不同。
字面量方式:let a={} ?,原型為function Object的prototype,相當(dāng)于new Object()
構(gòu)造器方式:let p = new Person(),原型為Person函數(shù)的prototype
Object.create()方式:let a={} ? let b=Object.create(a) ,原型為a
按照上述理解,可以構(gòu)建出如下思維導(dǎo)圖:

然后再梳理一下實(shí)例對象、構(gòu)造函數(shù)、原型之間的轉(zhuǎn)換:
可得,如下思維導(dǎo)圖:

由于__proto__
是任何對象都有的屬性,而JS中萬物皆可為對象,因此可以通過__proto__
不斷連接其父級原型對象,到了父級原型對象這一步,同樣也會有新的原型圈(就是下圖的閉環(huán)),最后會到達(dá)頂層Object.prototype,它的 __proto__
指向null結(jié)束,這條鏈路就被稱為原型鏈,同時JS引擎查找屬性時也會按照原型鏈的方向逐層去查找直到找到為止。
按照上述理解,并添以簡單代碼加以理解,可得思維導(dǎo)圖:

當(dāng)然,其中還有不明確的點(diǎn),那么就需要自己去搜索理解,搞明白每一個點(diǎn)所代表的意義和作用,給個原型鏈的經(jīng)典圖用以檢驗(yàn),從左至右的三列分別對應(yīng)的是實(shí)例、構(gòu)造函數(shù)、原型:

最后
走過路過,不要錯過,點(diǎn)贊、收藏、評論三連~