prototype原型對(duì)象(面向?qū)ο?--自動(dòng)繼承)

上一篇的構(gòu)造函數(shù)是有缺陷的,在每一次new function(實(shí)參)的時(shí)候,function里的函數(shù)會(huì)自動(dòng)創(chuàng)建,雖然每一次創(chuàng)建的函數(shù)都存在于不同的地址里,但是函數(shù)定義是一模一樣的,都是console.log(`I'm${this.name}I'm${this.age}`);如果每次new一個(gè)新的對(duì)象,那么function將會(huì)創(chuàng)建無(wú)數(shù)次,浪費(fèi)內(nèi)存。這時(shí)候就需要一個(gè)可共用的原型對(duì)象prototype。以后的構(gòu)造函數(shù)中也只應(yīng)有屬性,不應(yīng)有方法。

其實(shí)在new Emp(實(shí)參)之后,new的子對(duì)象會(huì)自動(dòng)繼承Emp(實(shí)參)里的prototype。(當(dāng)構(gòu)造函數(shù)創(chuàng)建的時(shí)候也會(huì)跟著一起創(chuàng)建)。所以只需要在創(chuàng)建Emp(形參)構(gòu)造函數(shù)后,把子對(duì)象需要繼承的函數(shù)寫(xiě)入構(gòu)造函數(shù)的prototype里。也就是Emp.prototype.intro=function(){console.log(`I'm${this.name}I'm${this.age}`);}子對(duì)象中的_ _proto_ _會(huì)自動(dòng)指向prototype。可用console.log(caiBiBa.intro==Emp.prototype.intro);來(lái)驗(yàn)證兩個(gè)是否指向同一個(gè)。

當(dāng)caiBiBa.intro()的時(shí)候首先會(huì)在自身的caiBiBa中找,沒(méi)找著時(shí)會(huì)沿著_ _proto_ _去到父對(duì)象中查找。

父對(duì)象中也能存儲(chǔ)共有屬性,比如Emp.prototype.dept="tech";子對(duì)象也能調(diào)用這個(gè)共有屬性:caiBiBa.dept。

子對(duì)象可以修改自有屬性(eg:caiBiBa.name="aba"),共有屬性只能由父對(duì)象自己修改,如果子對(duì)象修改共有屬性,會(huì)變成在子對(duì)象中創(chuàng)建一個(gè)同名的屬性(eg:caiBiBa.dept="art"),在調(diào)用時(shí)因?yàn)橛许樞颍ㄏ仍谧陨聿檎?,找不到再到父?duì)象中查找)所以只會(huì)調(diào)用不小心創(chuàng)建的同名屬性,而無(wú)論父對(duì)象如何修改它的共有屬性也與子對(duì)象無(wú)關(guān)了。但如果用caiBiBa._ _proto_ _.dept="art"來(lái)改的話,是改的父對(duì)象中的屬性,因?yàn)楦笇?duì)象.prototype==子對(duì)象._ _prototype_ _。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容