摘要:所有引用類型的隱式原型指向它構(gòu)造函數(shù)的顯式原型。理論就不驗(yàn)證了,寫原型模式時(shí)。原型模式構(gòu)造函數(shù)原型實(shí)例化橘貓魚呀魚橘貓魚呀魚在上述代碼中,在之后就相當(dāng)于這個(gè)函數(shù)。
上一章:new一個(gè)對(duì)象的過程 https://segmentfault.com/a/11...
原型鏈4大理論:
1.所有的引用類型都有一個(gè)_proto_屬性,稱之為隱式原型。
2.所有的函數(shù)(Function)都有一個(gè)prototype屬性,稱之為顯式原型或者直接叫原型。
3.所有引用類型的隱式原型指向它構(gòu)造函數(shù)的顯式原型。
4.當(dāng)試圖得到一個(gè)對(duì)象的某個(gè)屬性時(shí),如果這個(gè)對(duì)象本身沒有這個(gè)屬性,那么它會(huì)去到_proto_中尋找。(也就相當(dāng)于會(huì)去構(gòu)造函數(shù)的prototype中尋找)
畫了一個(gè)圖:
ps:關(guān)于JS的數(shù)據(jù)類型在下一章有
那我們來驗(yàn)證一下:
驗(yàn)證:
理論1:所有的引用類型都有一個(gè)_proto_屬性,稱之為隱式原型。
//引用類型 var obj = { x:1, y:2 } console.log("obj:",obj) var arr = [1,2,3] console.log("arr:",arr) //值類型 var str = "abc"; var num = 123; console.log("str:",str) console.log("num:",num)
控制臺(tái)打印的日志如下:
可以看出,值類型的都有隱式原型。理論1成立。
理論2就不驗(yàn)證了,寫原型模式時(shí)。本身就可以直接用。例如:Animal.prototype={}
理論3:3.所有引用類型的隱式原型指向它構(gòu)造函數(shù)的顯式原型。在上一章new一個(gè)對(duì)象的過程中步驟2驗(yàn)證過,成立。傳送門在頂部。
理論4:當(dāng)試圖得到一個(gè)對(duì)象的某個(gè)屬性時(shí),如果這個(gè)對(duì)象本身沒有這個(gè)屬性,那么它會(huì)去到_proto_中尋找。(也就相當(dāng)于去構(gòu)造函數(shù)的prototype中尋找)
這個(gè)是很重要的一個(gè)理論。詳細(xì)講解一下。
原型模式
在上述代碼中,在new之后cat就相當(dāng)于Animal這個(gè)函數(shù)。但是在Animal中并沒有eat()這個(gè)方法。
根據(jù)理論4,在_proto_中找到了eat()所以能成功執(zhí)行。為什么_proto_中就有eat()呢。因?yàn)樵趎ew的時(shí)候,步驟2時(shí)設(shè)置新的對(duì)象的隱式原型指向其構(gòu)造函數(shù)的顯式原型。
我們?cè)賮砜纯匆粋€(gè)東西:
原型模式
控制臺(tái)打印日志如下:
上圖可以看到cat執(zhí)行toString()并不會(huì)報(bào)錯(cuò),說明這個(gè)方法存在。但是既不在構(gòu)造函數(shù)里,也不在原型里,那在哪里呢?
根據(jù)理論4,如果這個(gè)對(duì)象本身沒有這個(gè)屬性,那么它會(huì)去到_proto_中尋找。(也就相當(dāng)于去構(gòu)造函數(shù)的prototype中尋找),所以在Animal.prototype中找不到,那么由于Animal.prototype是一個(gè)對(duì)象,屬于引用類型,也滿足定理4,所以在Animal.prototype的_proto_中繼續(xù)找,也就是到Object.prototype中找,剛好找到了!
這個(gè)一層一層的往上找就是所謂的原型鏈。(具體看最開始畫的那個(gè)圖)
也不能無限的往上找,避免死循環(huán),在往上就是null了。
哎喲說了這么多,請(qǐng)看:
下一回:JS的數(shù)據(jù)類型 https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98658.html
摘要:所有引用類型的隱式原型指向它構(gòu)造函數(shù)的顯式原型。理論就不驗(yàn)證了,寫原型模式時(shí)。原型模式構(gòu)造函數(shù)原型實(shí)例化橘貓魚呀魚橘貓魚呀魚在上述代碼中,在之后就相當(dāng)于這個(gè)函數(shù)。 上一章:new一個(gè)對(duì)象的過程 https://segmentfault.com/a/11... 原型鏈4大理論:1.所有的引用類型都有一個(gè)_proto_屬性,稱之為隱式原型。 2.所有的函數(shù)(Function)都有一個(gè)pro...
摘要:所有引用類型的隱式原型指向它構(gòu)造函數(shù)的顯式原型。理論就不驗(yàn)證了,寫原型模式時(shí)。原型模式構(gòu)造函數(shù)原型實(shí)例化橘貓魚呀魚橘貓魚呀魚在上述代碼中,在之后就相當(dāng)于這個(gè)函數(shù)。 上一章:new一個(gè)對(duì)象的過程 https://segmentfault.com/a/11... 原型鏈4大理論:1.所有的引用類型都有一個(gè)_proto_屬性,稱之為隱式原型。 2.所有的函數(shù)(Function)都有一個(gè)pro...
摘要:代碼在執(zhí)行之前會(huì)先全局中變量提升函數(shù)聲明。函數(shù)的執(zhí)行上下文,也就是在這個(gè)函數(shù)范圍內(nèi)找到函數(shù)執(zhí)行上下文中函數(shù)范圍內(nèi),所有用聲明的變量。函數(shù)執(zhí)行時(shí),按照?qǐng)?zhí)行位置查找變量作用域只會(huì)向上查找。下一回變量作用域與閉包 上一章:JS的數(shù)據(jù)類型 傳送門:https://segmentfault.com/a/11... 好!話不多少,我們就開始吧。對(duì)變量提升和函數(shù)聲明的理解,能讓你更清楚容易的理解,...
摘要:代碼在執(zhí)行之前會(huì)先全局中變量提升函數(shù)聲明。函數(shù)的執(zhí)行上下文,也就是在這個(gè)函數(shù)范圍內(nèi)找到函數(shù)執(zhí)行上下文中函數(shù)范圍內(nèi),所有用聲明的變量。函數(shù)執(zhí)行時(shí),按照?qǐng)?zhí)行位置查找變量作用域只會(huì)向上查找。下一回變量作用域與閉包 上一章:JS的數(shù)據(jù)類型 傳送門:https://segmentfault.com/a/11... 好!話不多少,我們就開始吧。對(duì)變量提升和函數(shù)聲明的理解,能讓你更清楚容易的理解,...
閱讀 782·2021-09-26 09:55
閱讀 2071·2021-09-22 15:44
閱讀 1480·2019-08-30 15:54
閱讀 1336·2019-08-30 15:54
閱讀 2681·2019-08-29 16:57
閱讀 526·2019-08-29 16:26
閱讀 2496·2019-08-29 15:38
閱讀 2132·2019-08-26 11:48