首先涉及到原型的概念督笆,什么叫原型呢?每個(gè)函數(shù)在創(chuàng)建的時(shí)候诱贿,都會有一個(gè)prototype屬性范删,該屬性指向了一個(gè)對象诡延,這個(gè)對象我們就叫做原型對象。
原型有什么作用呢?它能夠解決實(shí)例對象的屬性斧吐、方法共享問題召锈。
在提到原型時(shí)渐扮,我們總會提到構(gòu)造函數(shù)柑贞、實(shí)例,那么三者的關(guān)系是什么呢孔厉?
每個(gè)函數(shù)在創(chuàng)建時(shí)都會有一個(gè)prototype屬性拯钻,該屬性指向函數(shù)的原型對象。而函數(shù)的原型對象有一個(gè)constructor屬性撰豺,該屬性指向構(gòu)造函數(shù)粪般。至此,兩者之間互有聯(lián)系污桦。
而在利用構(gòu)造函數(shù)創(chuàng)建對象時(shí)亩歹,我們用到了關(guān)鍵字new。具體可以看我其中一篇博文。它實(shí)際上做了以下操作:
1.動(dòng)態(tài)創(chuàng)建對象
2.把this對象指向新創(chuàng)建的對象
3.把對象的__proto__屬性指向?qū)ο蟮膒rototype
4.返回對象
在創(chuàng)建對象時(shí)捆憎,實(shí)例對象會有一個(gè)constructor指向構(gòu)造函數(shù)舅柜。除此之外,在每個(gè)實(shí)例中都有一個(gè)Symbol對象的屬性[[Prototype]]躲惰,它無法直接被訪問致份,但是在Firefox、Safari和Chrome中础拨,每個(gè)實(shí)例對象可以通過proto屬性訪問到實(shí)例的原型對象氮块。至此,三者互有關(guān)聯(lián)诡宗。
那原型是如何實(shí)現(xiàn)實(shí)例間的屬性滔蝉、方法共享呢?
在訪問實(shí)例對象的方法或者屬性時(shí)塔沃,首先根據(jù)標(biāo)志符會在實(shí)例中尋找蝠引,當(dāng)找到該標(biāo)志符時(shí),返回對應(yīng)的屬性或者方法蛀柴。當(dāng)找不到時(shí)螃概,它會去尋找實(shí)例對象的原型中查找,如果找到鸽疾,則返回值吊洼。否則,返回undefined(實(shí)際上還會沿著原型的原型查找制肮,直至Object對象冒窍。這就涉及到繼承了)。
當(dāng)為對象添加屬性時(shí)豺鼻,我們再去訪問這個(gè)屬性综液。就會在實(shí)例對象中找到該屬性值,從而不會到原型對象中查找拘领。
然而在刪除屬性值時(shí)意乓,只會刪除實(shí)例對象的相應(yīng)屬性樱调,而不會在找不到屬性的情況下约素,刪除了原型對象的同名屬性。