最易理解的原型和原型鏈

一漓糙、什么是原型和原型鏈

我們先來看一個簡單的例子,首先我們定義一個Number()函數(shù)
var n1 = new Number(1)
這個時候我們就可以調(diào)用Number()函數(shù)的各種方法了胖烛,比如 toString()
n1.toString()

我們知道基本類型對象是存在棧內(nèi)存中的悔耘;復雜類型對象存在堆內(nèi)存中,棧內(nèi)存中只存其地址(指針)
所以此時 n1 如果要調(diào)用 toString() 方法的話翩活,必須有一個指針能指向這個對象逐哈。那么 toString() 這個方法存在哪里比較好呢芬迄,最基本的想法當然是存在 Number() 函數(shù)中好了

這樣調(diào)用當然不會有什么問題,但是如果此時我們再來一個
var n2 = new Number(2)
同是也調(diào)用 n2 的toString()方法
n2.toString

那此時我們就發(fā)現(xiàn)有一個問題昂秃,n1 和 n2 都有一個toString() 方法禀梳,如果在棧內(nèi)存中各自存儲一個toString() 的方法的話,很明顯比較浪費肠骆,當數(shù)據(jù)量變大時就會明顯影響性能算途。

所以,我們是不是能將toString() 這類大家都有可能會用到的方法打包放在一個對象內(nèi)蚀腿,然后在Number() 函數(shù)放一個指針不就好了嘴瓤,那就給這個指針取個名字吧,就叫__proto__


從圖中我們可以看到,Number(1) 中的有一個預(yù)設(shè)屬性__proto__廓脆,里面包含了 toString() 在內(nèi)的好幾個有關(guān)數(shù)值的方法筛谚。
那無關(guān)數(shù)值的方法,有關(guān)對象的方法呢hasOwnProperty(),眼尖同學已經(jīng)發(fā)現(xiàn)了停忿,在Number() 的__proto__中還有一個__proto__: Object,就像你所看到的一樣驾讲,這里指向的就是對象的通用方法写半。

又到了需要取名字的時候了褐望,這些通用的方法得存在棧內(nèi)寸中,Number() 的那就叫Number.prototype 吧

這里我們就你能看到n2.__proto__Number.prototype是一樣的,證明n2.__proto__指向的就是Number.prototype氧枣。


同理:n2.__proto__.__proto__ === Object.prototype也是true

這里我們就能推廣得到一個比較通用的法則 對象.__proto__ = 函數(shù).prototype
例如:

String.__proto__ === Function.prototype \\true
Number.__proto__ === Function.prototype \\true
Function.__proto__.__proto__ === Object.prototype  \\true

這個時候需要給這整個做法取個名字了,由于這些個公用屬性一個指向一個别垮,要是畫出箭頭指針便监,就像鏈子一樣,那就要原型鏈吧碳想。這些指向的最后就是null烧董。

Object.prototype.__proto__ === null //true

二、原型鏈解決了什么問題

我們要說到一個新詞繼承胧奔,依舊是 var n2 = new Number(2)逊移,我們沒有定義n2任何的屬性和方法,但是它卻能夠通過原型鏈調(diào)用Number.prototype龙填、甚至是Object.prototype 中的屬性和方法胳泉,這就是n2 繼承了符合它本身數(shù)據(jù)類型的公用屬性。
所以當試圖訪問一個對象的屬性時岩遗,它不僅僅在該對象上搜尋扇商,還會搜尋該對象的原型,以及該對象的原型的原型宿礁,依次層層向上搜索案铺,直到找到一個名字匹配的屬性或到達原型鏈的末尾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梆靖,一起剝皮案震驚了整個濱河市控汉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌返吻,老刑警劉巖姑子,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異思喊,居然都是意外死亡壁酬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舆乔,“玉大人岳服,你說我怎么就攤上這事∠A” “怎么了吊宋?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颜武。 經(jīng)常有香客問我璃搜,道長,這世上最難降的妖魔是什么鳞上? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任这吻,我火速辦了婚禮,結(jié)果婚禮上篙议,老公的妹妹穿的比我還像新娘唾糯。我一直安慰自己,他們只是感情好鬼贱,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布移怯。 她就那樣靜靜地躺著,像睡著了一般这难。 火紅的嫁衣襯著肌膚如雪舟误。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天姻乓,我揣著相機與錄音嵌溢,去河邊找鬼。 笑死糖权,一個胖子當著我的面吹牛堵腹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播星澳,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼疚顷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了禁偎?” 一聲冷哼從身側(cè)響起腿堤,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎如暖,沒想到半個月后笆檀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡盒至,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年酗洒,在試婚紗的時候發(fā)現(xiàn)自己被綠了士修。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡樱衷,死狀恐怖棋嘲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矩桂,我是刑警寧澤沸移,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站侄榴,受9級特大地震影響雹锣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜癞蚕,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一蕊爵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涣达,春花似錦在辆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浑度。三九已至寇窑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箩张,已是汗流浹背甩骏。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留先慷,地道東北人饮笛。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像论熙,于是被迫代替她去往敵國和親福青。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容