js 原型鏈煞檩、__proto__处嫌、prototype

本文由用途意義,進(jìn)行腦測解析斟湃,從需求角度走一遍原型鏈的發(fā)展熏迹。


用對象模擬類的繼承

js中沒有類(沒有類,沒有類凝赛,重要的事情說3遍)只有對象注暗,怎么才能做到繼承的效果坛缕?

var a={x:1}
var b={};
b.__proto__=a;

接下來進(jìn)行約定,當(dāng)訪問b.x但不存在時捆昏,就自動去訪問b.__proto__.x赚楚。

邏輯上就這么一回事。不過需要注意骗卜,這里說的只是訪問宠页。b.x=2這種是無法對a,也就是b.__proto__造成影響的寇仓;同時這個為b賦予了x屬性举户,b.x將覆蓋掉b.__proto__.x

通俗點總結(jié)焚刺,就是給對象掛一個父對象敛摘,當(dāng)對象沒有相應(yīng)屬性時,就去它父對象那里找乳愉。


__proto__指向構(gòu)造函數(shù)的prototype

var A=function(){ }
var b = new A();

這個時候又該怎樣用__proto__實現(xiàn)繼承效果兄淫?

首先函數(shù)也是一個對象,除了A();這樣以函數(shù)調(diào)用蔓姚,還能A.x=1;這樣把A當(dāng)普通對象使用(下文中函數(shù)捕虽、函數(shù)對象,都是一回事)坡脐。知道這個后實現(xiàn)繼承很簡單泄私,增加一個屬性即可:

A.prototype={constructor: A};//提醒一下怕忘記了,這里相當(dāng)于A增加了屬性prototype
A.prototype.x=1;
b.__proto__ = A.prototype;

js會為每個這樣new出來的對象做這個處理备闲,自己不用寫晌端。

顯然,這里的A.prototype就類似與一開始例子中的a恬砂,往A.prototype增加屬性咧纠,那么所有new A()出來的對象都能訪問到這個新的屬性。

為什么js要默認(rèn)增加constructor: A這個屬性到prototype中泻骤?這里與new操作符有關(guān)漆羔,是為了解決另一個問題。另外常說的prototype的構(gòu)造函數(shù)狱掂,就是指這個演痒。

總結(jié):
反正就是通過new 函數(shù)()這樣出來的對象,其__proto__默認(rèn)指向構(gòu)造函數(shù)(這里說的是函數(shù)對象本身趋惨,它跟在new后面也被稱作構(gòu)造函數(shù))的prototype屬性鸟顺。

實際上我覺得一般不以這個方法進(jìn)行有大量屬性的繼承,一是查找有無屬性的效率問題器虾,二是new時構(gòu)造方法把this改為新建對象的指向就足以完成屬性的添加和賦值诊沪,無需操作prototype進(jìn)行繼承养筒。


值得注意的要點

__proto__、prototype是什么一回事相信已經(jīng)了解端姚,剩下的就是經(jīng)常把人繞暈的Object.prototype、Function.prototype這些東西了挤悉。

先提一下渐裸,ObjectFunction都是一個函數(shù)對象装悲,跟上面的A差不多昏鹃,既能new Object()也能Object.xxx這樣用。

Object:

1.所以var b=new Object();后诀诊,b.__proto__===Object.prototype這個應(yīng)該沒有什么疑問洞渤。

2.新的標(biāo)準(zhǔn)中可用b=Object.creat(a),可當(dāng)作是b=new Object(); b.__proto__=a属瓣,還是這套操作载迄,問題不大。

3.如果是var b={}這種直接通過字面量創(chuàng)建對象抡蛙,js會自動進(jìn)行b.__proto__=Object.prototype护昧,知道后問題也不大。

4.就是默認(rèn)情況下粗截,你不手動搞__proto__惋耙、prototype的指向,最終__proto__都會去指向Object.prototype熊昌。

5.Object.prototype
本質(zhì)上跟前面示例中的prototype沒什么不同绽榛,只是這個prototype會被js自動增加一些屬性

6.Object.prototype.__proto__===null 跟在c++/java中遍歷鏈表一樣,當(dāng)__proto__為null時說明到頭了婿屹。當(dāng)作js自動設(shè)置上去的就行灭美,沒什么其他特殊

7.Object.__proto__===Function.prototype 下面再講。

Function:

1.所有的函數(shù)對象都是Function的實例选泻。
不是說沒有類嗎冲粤,這個實例又是什么意思?
emmm页眯,習(xí)慣說法而已梯捕,具體什么操作沒研究也不懂,或許當(dāng)作js自動這樣做:

var f=function(){}
f.__proto__=Function.prototype;

//或者這樣理解
var f=new Function();
然后把你的代碼放進(jìn)去f

2.Function.__proto__===Function.prototype;
前面提過Object窝撵、Function都是一個函數(shù)對象傀顾,把它們代入第1點例子的f就行。上面第6點同理碌奉。

按照理解短曾,可能會這樣的疑問:Function.__proto__指向構(gòu)造函數(shù)(再次提醒寒砖,是一個對象)的prototype,所以Function這個對象的構(gòu)造函數(shù)是它自己嫉拐?自己創(chuàng)建自己么哩都?
額。婉徘。漠嵌。我覺得這種操作可能就是為了統(tǒng)一,只要記住“所有函數(shù)對象的__proto__都是Function.prototype”就行盖呼。

3.Function.prototype.__proto__===Object.prototype;
沒什么特別的儒鹿,把Function.prototype代入上面Object第1點的b就行,不要特殊看待几晤,硬要說與b不同的話约炎,只是因為“函數(shù)對象的prototype默認(rèn)會被增加一個constructor屬性”而已,沒什么大問題


總結(jié):

1.我們在js中說的“類型”蟹瘾,可以說只是習(xí)慣用語圾浅,實際上仍舊是沒有所謂的類概念的,只有用對象來“模擬類”热芹。

2.prototype就是指向一個普通對象prototype=new Object()贱傀,只不過這個對象被添加其他一些屬性后,再被自動放到到函數(shù)對象的屬性中伊脓。

3.__proto__就是 原型/原型對象府寒,不斷的找原型的原型最終到--->Object.prototype--->Object.prototype.__proto__ (null)。原型對象可能是一個普通的對象报腔;也可能是js自動放入到函數(shù)對象的prototype

4.我覺得js這套東西根本目的是批量為對象賦予屬性同時減少代碼冗余株搔,上面解析的ObjectFunction纯蛾、例子中的A都只是函數(shù)對象纤房,不是像java一樣的類,平時說對象的類型只是方便日常交流翻诉,instanceof也只是很粗暴的遞歸比較對象__proto__ === 函數(shù)對象.prototype這種炮姨。把類的概念丟掉,保留對象碰煌、屬性這概念舒岸,從這出發(fā)又回頭去實現(xiàn)“類”、“繼承”這東西芦圾,就出來這么套東西蛾派。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子洪乍,更是在濱河造成了極大的恐慌眯杏,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳澳,死亡現(xiàn)場離奇詭異岂贩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钾埂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門河闰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褥紫,你說我怎么就攤上這事〉苫郏” “怎么了髓考?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弃酌。 經(jīng)常有香客問我氨菇,道長,這世上最難降的妖魔是什么妓湘? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任查蓉,我火速辦了婚禮,結(jié)果婚禮上榜贴,老公的妹妹穿的比我還像新娘豌研。我一直安慰自己,他們只是感情好唬党,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布鹃共。 她就那樣靜靜地躺著,像睡著了一般驶拱。 火紅的嫁衣襯著肌膚如雪轻要。 梳的紋絲不亂的頭發(fā)上哄褒,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼浮还。 笑死,一個胖子當(dāng)著我的面吹牛淤翔,可吹牛的內(nèi)容都是我干的剔难。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翁狐,長吁一口氣:“原來是場噩夢啊……” “哼类溢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闯冷,失蹤者是張志新(化名)和其女友劉穎砂心,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛇耀,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡辩诞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纺涤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片译暂。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撩炊,靈堂內(nèi)的尸體忽然破棺而出外永,到底是詐尸還是另有隱情,我是刑警寧澤拧咳,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布伯顶,位于F島的核電站,受9級特大地震影響骆膝,放射性物質(zhì)發(fā)生泄漏祭衩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一阅签、第九天 我趴在偏房一處隱蔽的房頂上張望掐暮。 院中可真熱鬧,春花似錦政钟、人聲如沸路克。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衷戈。三九已至,卻和暖如春层坠,著一層夾襖步出監(jiān)牢的瞬間殖妇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工破花, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留谦趣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓座每,卻偏偏與公主長得像前鹅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子峭梳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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