最近博主在學習原型以及原型鏈的相關(guān)內(nèi)容葫督,把高級程序設(shè)計里第六章看完之后竭鞍,感覺還是挺好理解的,于是有些飄飄然橄镜,仿佛得到了全世界
但是最近的一道刨丝欤客面試題,讓我半天摸不到頭腦洽胶,于是深受打擊的我開始痛定思痛晒夹,從網(wǎng)上搜索了相關(guān)內(nèi)容,仔細研讀了一番姊氓,這里將最近看到的相關(guān)知識點總結(jié)起來丐怯,以方便日后忘記了能夠快速回顧。
首先翔横,先插入一張經(jīng)典圖:
這張圖清晰展示了構(gòu)造函數(shù)读跷,函數(shù),對象禾唁,原型對象舔亭,以及__proto__隱式原型和prptotype顯式原型的愛恨情仇些膨,不過對于初學者來說,這張圖看起來還是有一定難度的钦铺,所以需要下面你的一些只是來做鋪墊:
首先,要明確幾個點:
1.在JS里肢预,萬物皆對象矛洞。方法(Function)是對象,方法的原型(Function.prototype)是對象烫映。因此沼本,它們都會具有對象共有的特點。即:對象具有屬性__proto__锭沟,可稱為隱式原型抽兆,一個對象的隱式原型指向構(gòu)造該對象的構(gòu)造函數(shù)的原型,這也保證了實例能夠訪問在構(gòu)造函數(shù)原型中定義的屬性和方法族淮。
2.方法(Function)方法這個特殊的對象辫红,除了和其他對象一樣有上述_proto_屬性之外,還有自己特有的屬性——原型屬性(prototype)祝辣,這個屬性是一個指針贴妻,指向一個對象,這個對象的用途就是包含所有實例共享的屬性和方法(我們把這個對象叫做原型對象)蝙斜。原型對象也有一個屬性名惩,叫做constructor,這個屬性包含了一個指針孕荠,指回原構(gòu)造函數(shù)娩鹉。
好啦,知道了這兩個基本點稚伍,我們來看看上面這副圖弯予。1.構(gòu)造函數(shù)Foo()構(gòu)造函數(shù)的原型屬性Foo.prototype指向了原型對象,在原型對象里有共有的方法槐瑞,所有構(gòu)造函數(shù)聲明的實例(這里是f1熙涤,f2)都可以共享這個方法。
3.原型對象Foo.prototypeFoo.prototype保存著實例共享的方法困檩,有一個指針constructor指回構(gòu)造函數(shù)祠挫。
4.實例f1和f2是Foo這個對象的兩個實例,這兩個對象也有屬性__proto__悼沿,指向構(gòu)造函數(shù)的原型對象等舔,這樣子就可以像上面1所說的訪問原型對象的所有方法啦。
另外:構(gòu)造函數(shù)Foo()除了是方法糟趾,也是對象啊慌植,它也有__proto__屬性甚牲,指向誰呢?指向它的構(gòu)造函數(shù)的原型對象唄蝶柿。函數(shù)的構(gòu)造函數(shù)不就是Function嘛丈钙,因此這里的__proto__指向了Function.prototype。其實除了Foo()交汤,F(xiàn)unction(), Object()也是一樣的道理雏赦。原型對象也是對象啊,它的__proto__屬性芙扎,又指向誰呢星岗?同理,指向它的構(gòu)造函數(shù)的原型對象唄戒洼。這里是Object.prototype.最后俏橘,Object.prototype的__proto__屬性指向null。
一定記兹健:原型鏈是通過__proto__屬性來連接的A绕!:憾睢曹仗!
f.constructor===F.prototype.constructor===F(紅寶書上只說了構(gòu)造函數(shù)的原型對象的constructor指向構(gòu)造函數(shù)本身,但沒有說實例對象的constructor屬性也指向構(gòu)造函數(shù)本身)蠕搜;
好的怎茫,現(xiàn)在再來看看那道難倒我的牛課題:
var?F =?function(){};
Object.prototype.a =?function(){};
Function.prototype.b =?function(){};
var?f =?new?F();
問:通過f能訪問到a或者b嗎?
答案是可以通過f取到方法a妓灌,但是取不到方法b.
訪問到方法a的方式有這么幾種:
1.f.a(因為f是構(gòu)造函數(shù)F實例化的對象轨蛤,a這個方法在對象原型上,所以f可以通過原型鏈找到a方法,即f.__proto__指向F.prototype,而F.prototype.__proto__指向Object.prototype)
2.F.a(F.__proto__指向Function.prototype虫埂,而Function.prototype.__proto__指向Object.prototype)
3.f.constructor.a(因為f.constructor就是F)
訪問到b的方式有以下幾種:
1.F.b(因為F.__proto__指向Function.prototype祥山,而Function.prototype.___proto__指向Object.prototype)
2.f.cnstructor.b(因為f.constructor就是F)
3.F.prototype.constructor.b(因為F的原型對象的constructor屬性指向構(gòu)造函數(shù)自身)
來源https://blog.csdn.net/cmz392997520/article/details/78426311