什么是原型和原型鏈?
在講這個(gè)之前,我們先把這個(gè)名詞忘掉,不要試圖從字面意思去理解這個(gè)詞,它只是幾個(gè)漢字,我們可以把這個(gè)看成[ab]和[abc]。
在這之前我們先來(lái)了解一些必要的知識(shí)
數(shù)據(jù)類(lèi)型
js里 數(shù)據(jù)類(lèi)型分為 7 種:
string? number? null undefined? object Boolean??symbol??
數(shù)據(jù)類(lèi)型又分兩種:簡(jiǎn)單數(shù)據(jù)類(lèi)型 復(fù)雜數(shù)據(jù)類(lèi)型 。 復(fù)雜類(lèi)型是由簡(jiǎn)單類(lèi)型組成的。
復(fù)雜數(shù)據(jù)類(lèi)型只有object
內(nèi)存:棧內(nèi)存 堆內(nèi)存
這個(gè)就不從頭開(kāi)始介紹了,我們可以簡(jiǎn)單的把這個(gè)想象成這個(gè)虛擬的空間, 我們把這個(gè)分為兩個(gè)部分:棧內(nèi)存部分,堆內(nèi)存部分。
一般的,當(dāng)我們創(chuàng)建一個(gè)新的對(duì)象時(shí),簡(jiǎn)單的數(shù)據(jù)類(lèi)型的值直接存在棧內(nèi)存中。 復(fù)雜數(shù)據(jù)類(lèi)型的值存在堆內(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)開(kāi)的屬性 __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 寫(xiě)下這行代碼的時(shí)候 它還只是個(gè)簡(jiǎn)單類(lèi)型 它的值 直接存在棧內(nèi)存中?
但我們寫(xiě)下 a2.toString()的時(shí)候 它就會(huì)被一個(gè)臨時(shí)對(duì)象(temp)替代? 這個(gè)對(duì)象 跟 temp = new Number(1)? 完全相同
這樣它就能想a1一樣 調(diào)用這些屬性,當(dāng)你完成這些操作得到返回值時(shí)候這個(gè)臨時(shí)對(duì)象就會(huì)被銷(xiāo)毀。
所以 var a = 1? 和 var a = num Number(1) 唯一的區(qū)別就是? 后者比前者寫(xiě)起來(lái)麻煩 除此之外沒(méi)有任何區(qū)別。
共用屬性
我們?cè)?var b = new Number(2) 跟 a1 比較

我們可以看到? 除了PrimitiveValue 不一樣之外 其他部分一樣? 。
因此我們可以知道__proto__:Number? 就是number 的共用屬性
JS 內(nèi)存是很稀缺的? js不可能每次創(chuàng)建一個(gè)number 對(duì)象 就寫(xiě)一遍這個(gè)屬性? 這樣非常浪費(fèi)空間
所以JS 把這些共有屬性存放在一個(gè)地方? 當(dāng)我們需要的時(shí)候 就通過(guò)__proto__:Number 找到它。
我們會(huì)注意到 在__proto__:Number 里面 還有一個(gè)__proto__:Object? ? 這個(gè)里面 是所有對(duì)象的共有屬性?
__proto__:Object? 里面還會(huì)指向其他的共有屬性嗎 沒(méi)有了?__proto__:Object 里面的?__proto__ 指向的是null
這些共用屬性是哪里來(lái)的
這些共有屬性不是你穿件對(duì)象時(shí)才出現(xiàn)的而是你一打開(kāi)瀏覽器就存在的
當(dāng)我們打開(kāi)瀏覽器 ,瀏覽器就會(huì)自動(dòng)創(chuàng)建一個(gè)全局對(duì)象global(window)? window對(duì)象會(huì)創(chuàng)建很多方法? 其中就包括 number() String()等等

這些不同的方法 構(gòu)造了 不用類(lèi)型的共用屬性? 然后供我們調(diào)用 這些構(gòu)造出來(lái)的共用屬性 我們就叫做 原型(prototype)
__proto__? 為了引用共用屬性用的。 我們把一層一層引用共用屬性的鏈接 叫做 原型鏈
對(duì)象的?__proto__ 指向的就是 創(chuàng)建這個(gè)對(duì)象的 函數(shù)構(gòu)造的prototype
