js 原型鏈繼承__proto__龄减、prototype簡析

js中的繼承關(guān)鍵是靠__proto__屬性實(shí)現(xiàn)的
prototype屬性的職責(zé)是將原型鏈中的數(shù)據(jù)放入__proto__中的中介坟桅,即我們在new 一個對象的時候

js中有兩種對象璃氢,即函數(shù)對象和普通對象
  • 函數(shù)對象: 凡是通過new Function()創(chuàng)建的都是函數(shù)對象
    函數(shù)對象屬性包含__proto__和prototype兩個屬性哟玷;而普通對象有__proto__沒有prototype屬性,
    像 Number;Object;Array都是函數(shù)對象
//例如 
var a = function(){};  function a(){}; var a = new Function(); var a = Function();
  • 普通對象: 不是通過new Function()創(chuàng)建的對象
//例如
 var a = 1 即(a = new Number(1)); var a = 'hello'即(a = new String(1));var a = []即(a = new Array());
  • __proto__
    主要用來回溯對象,即用來繼承的巢寡,即當(dāng)執(zhí)行a.b的時候喉脖,如果當(dāng)前對象沒有定義b屬性,則會通過a.__proto__到父對象中查找抑月,以此類推
  • prototype
    *其值是函數(shù)創(chuàng)建的時候創(chuàng)建了一個它的實(shí)例對象树叽,并賦值給prototype,其作用是將值傳遞給實(shí)例對象的__proto__谦絮,以實(shí)現(xiàn)繼承
  • 實(shí)例代碼 Function
    主要演示函數(shù)對象Function的__proto__屬性以及prototype屬性的值
   console.log('--------------------------------函數(shù)對象Function--------------------------------------');
 //函數(shù)對象Function   Function.prototype === Function.__proto__  (true)
 //此例比如 var temp = new Function();Function.prototype = temp;
//所以Function.prototype 為function
 console.log('Function.prototype:',Function.prototype);
 console.log('Function.__proto__:',Function.__proto__);
 //原始對象Object
 console.log('Function.prototype.__proto__:',Function.prototype.__proto__);
 console.log('Function.__proto__.__proto__:',Function.__proto__.__proto__);
 //一切的起點(diǎn)null 所有對象通過__proto__回溯都會找到null
 console.log('Function.prototype.__proto__.__proto__:',Function.prototype.__proto__.__proto__);
 console.log('Function.__proto__.__proto__.__proto__:',Function.__proto__.__proto__.__proto__);
 //會抱錯题诵,null是起點(diǎn) null沒有__proto__屬性 不能在回溯
console.log('Function.prototype.__proto__.__proto__.__proto__:',Function.__proto__.__proto__.__proto__.__proto__);
console.log('Function.__proto__.__proto__.__proto__.__proto__:',Function.__proto__.__proto__.__proto__.__proto__);
  • chrome下輸出


    1.png
  • 實(shí)例代碼 Number
    主要演示函數(shù)對象Number的__proto__屬性以及prototype屬性的值
   console.log('--------------------------------函數(shù)對象Number--------------------------------------');
 //函數(shù)對象Number  其實(shí)可以理解為var Number = new Function();
 //原型對象prototype的值實(shí)際是函數(shù)創(chuàng)建的時候創(chuàng)建了一個它的實(shí)例對象,并賦值給prototype
//此例比如  var temp = new Number();Number.prototype = temp;Number.prototype 為Number的實(shí)例對象层皱,是普通對象,繼承自O(shè)bject
//所以typeof Number.prototype 為 Object
//Number為Function的實(shí)例對象性锭,而Function.__proto__為function ,
//所以typeof Number.__proto__ 為 function
console.log('Number.prototype:',Number.prototype);
console.log('Number.__proto__:',Number.__proto__);
console.log('typeof Number.prototype:',typeof Number.prototype);
console.log('typeof Number.__proto__:',typeof Number.__proto__);
//原始對象Object
console.log('Number.prototype.__proto__:',Number.prototype.__proto__);
console.log('Number.__proto__.__proto__:',Number.__proto__.__proto__);
//原始對象 無中生有的無 即null,
console.log('Number.prototype.__proto__.__proto__:',Number.prototype.__proto__.__proto__);
console.log('Number.__proto__.__proto__.__proto__:',Number.__proto__.__proto__.__proto__);
//會抱錯叫胖,因?yàn)閚ull沒有__proto__屬性console.log('Number.prototype.__proto__.__proto__.__proto__:',Number.__proto__.__proto__.__proto__.__proto__);
console.log('Number.__proto__.__proto__.__proto__.__proto__:',Number.__proto__.__proto__.__proto__.__proto__);
  • chrome下輸出


    2.png
  • 實(shí)例代碼 Object
    主要演示函數(shù)對象Object的__proto__屬性以及prototype屬性的值
console.log('--------------------------------函數(shù)對象Object--------------------------------------');
console.log('Object.prototype:',Object.prototype);
console.log('Object.__proto__:',Object.__proto__);
console.log('typeof Object.prototype:',typeof Object.prototype);
console.log('typeof Object.__proto__:',typeof Object.__proto__);
//原始對象 無中生有的無 即null草冈,
console.log('Object.prototype.__proto__:',Object.prototype.__proto__);
//Object
console.log('Object.__proto__.__proto__:',Object.__proto__.__proto__);
//null
console.log('Object.__proto__.__proto__.__proto__:',Object.__proto__.__proto__.__proto__); 
//抱錯
//console.log('Object.prototype.__proto__.__proto__:',Object.prototype.__proto__.__proto__);
  • chrome下輸出


    3.png
  • 實(shí)例代碼
    主要演示普通對象的__proto__屬性以及prototype屬性的值
console.log('--------------------------------普通對象--------------------------------------');
 //例如 var a = 1 即(a = new Number(1)); var a = 'hello'即(a = new String(1));var a = []即(a = new Array());
   function obj(){
    this.a = 1;this.b = 2; }
    obj.prototype.pMethod=function(){
    console.log('ddd');
   }
   var c = new obj();
//普通對象c 沒有prototype屬性,所以typeof c.prototype 為 Object
//c為Function的實(shí)例對象瓮增,而Function.__proto__為function 
//所以typeof c.__proto__ 為 function
console.log('c.prototype:',c.prototype);  //undefined
//我們再來看看__proto__的定義:他的值是創(chuàng)建實(shí)例對象的時候?qū)?yīng)的函數(shù)對象的原型對象
//即obj.prototype = new obj();
//obj.prototype.pMethod=function(){console.log('ddd');}
//c.__proto__ = obj.prototype;
//此時__proto__中有obj實(shí)例對象以及pMethod函數(shù)怎棱、__prototype__ 屬性
   console.log('c.__proto__:',c.__proto__);
//如果我們這樣定義原型鏈函數(shù)
   obj.prototype = {
    pMethod:function(){
     console.log('ddd');
    }
   }
   var c = new obj();
   //__proto__的定義:他的值是創(chuàng)建實(shí)例對象的時候?qū)?yīng)的函數(shù)對象的原型對象
   //即obj.prototype = new obj();
   //obj.prototype= {pMethod:function(){console.log('ddd');}}
   //c.__proto__ = obj.prototype
   //此時__proto__中有pMethod函數(shù)、__prototype__ 屬性
   console.log('c.__proto__:',c.__proto__);
   //原始對象Object
   console.log('c.__proto__.__proto__:',c.__proto__.__proto__);
   //原始對象 無中生有的無 即null绷跑,
 console.log('c.__proto__.__proto__.__proto__:',c.__proto__.__proto__.__proto__);
//會抱錯拳恋,因?yàn)閚ull沒有__proto__屬性 //console.log('c.prototype.__proto__.__proto__.__proto__:',c.__proto__.__proto__.__proto__.__proto__);
  • chrome下輸出


    4.png

總結(jié)

一個對象的proto記錄著自己的原型鏈,決定了自身的數(shù)據(jù)類型砸捏,改變proto就等于改變對象的數(shù)據(jù)類型谬运。
函數(shù)的prototype不屬于自身的原型鏈,其值是創(chuàng)建函數(shù)對象的實(shí)例带膜,它是子類創(chuàng)建的核心吩谦,決定了子類的數(shù)據(jù)類型,是連接子類原型鏈的橋梁膝藕。
在原型對象上定義方法和屬性的目的是為了被子類繼承和使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末式廷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芭挽,更是在濱河造成了極大的恐慌滑废,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袜爪,死亡現(xiàn)場離奇詭異蠕趁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辛馆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門俺陋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豁延,“玉大人,你說我怎么就攤上這事腊状∮沼剑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵缴挖,是天一觀的道長袋狞。 經(jīng)常有香客問我,道長映屋,這世上最難降的妖魔是什么苟鸯? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮棚点,結(jié)果婚禮上早处,老公的妹妹穿的比我還像新娘。我一直安慰自己乙濒,他們只是感情好陕赃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布卵蛉。 她就那樣靜靜地躺著颁股,像睡著了一般。 火紅的嫁衣襯著肌膚如雪傻丝。 梳的紋絲不亂的頭發(fā)上甘有,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音葡缰,去河邊找鬼亏掀。 笑死,一個胖子當(dāng)著我的面吹牛泛释,可吹牛的內(nèi)容都是我干的滤愕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼怜校,長吁一口氣:“原來是場噩夢啊……” “哼间影!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茄茁,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤魂贬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裙顽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體付燥,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年愈犹,在試婚紗的時候發(fā)現(xiàn)自己被綠了键科。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勋颖,靈堂內(nèi)的尸體忽然破棺而出梆掸,到底是詐尸還是另有隱情,我是刑警寧澤牙言,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布酸钦,位于F島的核電站,受9級特大地震影響咱枉,放射性物質(zhì)發(fā)生泄漏卑硫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一蚕断、第九天 我趴在偏房一處隱蔽的房頂上張望欢伏。 院中可真熱鬧,春花似錦亿乳、人聲如沸硝拧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽障陶。三九已至,卻和暖如春聊训,著一層夾襖步出監(jiān)牢的瞬間抱究,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工带斑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鼓寺,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓勋磕,卻偏偏與公主長得像妈候,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挂滓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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