什么是原型和原型鏈礼饱?
在講這個(gè)之前坏为,我們先把這個(gè)名詞忘掉,不要試圖從字面意思去理解這個(gè)詞镊绪,它只是幾個(gè)漢字匀伏,我們可以把這個(gè)看成[ab]和[abc]。
在這之前我們先來了解一些必要的知識(shí)
數(shù)據(jù)類型
js里 數(shù)據(jù)類型分為 7 種:
string? number? null undefined? object Boolean??symbol??
數(shù)據(jù)類型又分兩種:簡(jiǎn)單數(shù)據(jù)類型 復(fù)雜數(shù)據(jù)類型 蝴韭。 復(fù)雜類型是由簡(jiǎn)單類型組成的够颠。
復(fù)雜數(shù)據(jù)類型只有object
內(nèi)存:棧內(nèi)存 堆內(nèi)存
這個(gè)就不從頭開始介紹了,我們可以簡(jiǎn)單的把這個(gè)想象成這個(gè)虛擬的空間榄鉴, 我們把這個(gè)分為兩個(gè)部分:棧內(nèi)存部分履磨,堆內(nèi)存部分。
一般的庆尘,當(dāng)我們創(chuàng)建一個(gè)新的對(duì)象時(shí)剃诅,簡(jiǎn)單的數(shù)據(jù)類型的值直接存在棧內(nèi)存中。 復(fù)雜數(shù)據(jù)類型的值存在堆內(nèi)存中驶忌,但是在棧內(nèi)存中會(huì)存一個(gè)地址矛辕,好讓我們能在堆內(nèi)存中找到它。
1? 與 new Number(1) 的區(qū)別
當(dāng)我們 var a1 = new Number(1)? ?js創(chuàng)建了一個(gè)對(duì)象(哈希)付魔,除了一個(gè)PrimitiveValue
同時(shí)還有一個(gè)可以點(diǎn)開的屬性 __proto__:Number聊品, 這個(gè)屬性中包含了另一些屬性
這些屬性中有一些我們可以看懂的 toString? ?它指向一個(gè)toString函數(shù) 和一個(gè) valueOf屬性和它的函數(shù)
我們可以調(diào)用這些方法得到一些返回值
當(dāng)我們 用var a2 = 1 創(chuàng)建一個(gè)對(duì)象時(shí)候 我們同樣可以調(diào)用? toString() valueOf() ,這是為什么呢几苍?
因?yàn)?當(dāng)我們var a2 = 1 寫下這行代碼的時(shí)候 它還只是個(gè)簡(jiǎn)單類型 它的值 直接存在棧內(nèi)存中?
但我們寫下 a2.toString()的時(shí)候 它就會(huì)被一個(gè)臨時(shí)對(duì)象(temp)替代? 這個(gè)對(duì)象 跟 temp = new Number(1)? 完全相同
這樣它就能想a1一樣 調(diào)用這些屬性翻屈,當(dāng)你完成這些操作得到返回值時(shí)候這個(gè)臨時(shí)對(duì)象就會(huì)被銷毀。
所以 var a = 1? 和 var a = num Number(1) 唯一的區(qū)別就是? 后者比前者寫起來麻煩 除此之外沒有任何區(qū)別妻坝。
共用屬性
我們?cè)?var b = new Number(2) 跟 a1 比較
我們可以看到? 除了PrimitiveValue 不一樣之外 其他部分一樣? 伸眶。
因此我們可以知道__proto__:Number? 就是number 的共用屬性
JS 內(nèi)存是很稀缺的? js不可能每次創(chuàng)建一個(gè)number 對(duì)象 就寫一遍這個(gè)屬性? 這樣非常浪費(fèi)空間
所以JS 把這些共有屬性存放在一個(gè)地方? 當(dāng)我們需要的時(shí)候 就通過__proto__:Number 找到它惊窖。
我們會(huì)注意到 在__proto__:Number 里面 還有一個(gè)__proto__:Object? ? 這個(gè)里面 是所有對(duì)象的共有屬性?
__proto__:Object? 里面還會(huì)指向其他的共有屬性嗎 沒有了?__proto__:Object 里面的?__proto__ 指向的是null
這些共用屬性是哪里來的
這些共有屬性不是你穿件對(duì)象時(shí)才出現(xiàn)的而是你一打開瀏覽器就存在的
當(dāng)我們打開瀏覽器 ,瀏覽器就會(huì)自動(dòng)創(chuàng)建一個(gè)全局對(duì)象global(window)? window對(duì)象會(huì)創(chuàng)建很多方法? 其中就包括 number() String()等等
這些不同的方法 構(gòu)造了 不用類型的共用屬性? 然后供我們調(diào)用 這些構(gòu)造出來的共用屬性 我們就叫做 原型(prototype)
__proto__? 為了引用共用屬性用的赚抡。 我們把一層一層引用共用屬性的鏈接 叫做 原型鏈
對(duì)象的?__proto__ 指向的就是 創(chuàng)建這個(gè)對(duì)象的 函數(shù)構(gòu)造的prototype