一蜀涨、構(gòu)造函數(shù),原型對(duì)象蝎毡,實(shí)例對(duì)象三者之間的關(guān)系
每創(chuàng)建一個(gè)函數(shù)厚柳,該函數(shù)都會(huì)自動(dòng)帶有一個(gè)prototype屬性。該屬性是一個(gè)指針沐兵,指向一個(gè)對(duì)象别垮,該對(duì)象稱之為原型對(duì)象(js中一切繼承都是用原型對(duì)象實(shí)現(xiàn)的!)
原型對(duì)象上默認(rèn)有一個(gè)屬性constructor,該屬性也是一個(gè)指針扎谎,指向其相關(guān)聯(lián)的構(gòu)造函數(shù)碳想。
通過調(diào)用構(gòu)造函數(shù)產(chǎn)生的實(shí)例對(duì)象,都擁有一個(gè)內(nèi)部屬性_proto_毁靶,指向了原型對(duì)象胧奔。其實(shí)例對(duì)象能夠訪問原型對(duì)象上的所有屬性和方法。
總結(jié):三者的關(guān)系是老充,每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象葡盗,原型對(duì)象上包含著一個(gè)指向構(gòu)造函數(shù)的指針,而實(shí)例都包含著一個(gè)指向原型對(duì)象的內(nèi)部指針啡浊。通俗的說觅够,實(shí)例可以通過內(nèi)部指針訪問到原型對(duì)象,原型對(duì)象可以通過constructor找到構(gòu)造函數(shù)巷嚣。示例:
以上代碼定義了一個(gè)構(gòu)造函數(shù)People(),People.prototype指向原型對(duì)象喘先,其自帶屬性construtor又指回了People,即People.prototype.constructor==People.實(shí)例對(duì)象person由于其內(nèi)部指針指向了原型對(duì)象廷粒,所以可以訪問原型對(duì)象上的showType方法窘拯。
二、原型鏈
在第一部分我們說到坝茎,所有的實(shí)例都有一個(gè)內(nèi)部指針指向他的原型對(duì)象涤姊,并且可以訪問到原型對(duì)象上的所有屬性和方法。person實(shí)例對(duì)象指向了People的原型對(duì)象嗤放,可以訪問People原型對(duì)象上的所有屬性和方法思喊。如果People原型對(duì)象變成了某一個(gè)類的實(shí)例dog,這個(gè)實(shí)例又會(huì)指向一個(gè)新的原型對(duì)象DOG,那么person此時(shí)能訪問dog的實(shí)例屬性和DOG原型對(duì)象上的所有屬性和方法了。同理新的原型對(duì)象DOG碰巧有事另外一個(gè)對(duì)象的實(shí)例cat,這個(gè)對(duì)象實(shí)例指向原型對(duì)象CAT次酌,那么person就能訪問cat的實(shí)例屬性和CAT原型上的屬性和方法了恨课。
以上代碼,首先先定義了People構(gòu)造函數(shù)岳服,通過new People()得到實(shí)例剂公,會(huì)包含一個(gè)實(shí)例對(duì)象type和一個(gè)原型屬性showType。另外定義一個(gè)Cat構(gòu)造函數(shù)吊宋,然后情況發(fā)生變化纲辽,本來構(gòu)造函數(shù)Cat的prototype會(huì)執(zhí)行cat的原型對(duì)象,但是我們這里稍有改變璃搜,將Cat構(gòu)造函數(shù)的prototype指向了People實(shí)例對(duì)象覆蓋了Cat的原型對(duì)象文兑。當(dāng)Cat的實(shí)例對(duì)象cat去訪問type屬性時(shí),js首先在cat實(shí)例屬性中查找腺劣,發(fā)現(xiàn)沒有定義绿贞,接著去cat的原型對(duì)象上找,cat的原型對(duì)象這里已經(jīng)被我們改成了People實(shí)例橘原,那就是去People實(shí)例上去找籍铁。先找People的實(shí)例屬性,發(fā)現(xiàn)有type趾断,(如果實(shí)例屬性上面沒有type拒名,就去People的原型對(duì)象上去找)這個(gè)查找就是這么一級(jí)一級(jí)的往上查找。
我們可以通過原型鏈的方式芋酌,實(shí)現(xiàn) Cat繼承 People 的所有屬性和方法增显。總結(jié)來說:就是當(dāng)重寫了Cat.prototype指向的原型對(duì)象后脐帝,實(shí)例的內(nèi)部指針也發(fā)生了改變同云,指向了新的原型對(duì)象糖权,然后就能實(shí)現(xiàn)類與類之間的繼承了。