原型和原型鏈

錯誤之處茄唐,歡迎指正孝扛。


1. 原型和原型鏈

  1. 所有函數(shù)都有prototype這個屬性,這個屬性指向該函數(shù)的原型乎芳。原型是一個對象格式遵蚜。
  2. 所有對象都有__proto__這個屬性,這個屬性指向該對象的構(gòu)造函數(shù)的原型奈惑。注意:使用__proto__是不被推薦的一種方式吭净,推薦使用Object上的靜態(tài)方法Object.getPrototypeOf(obj)來獲取該對象的構(gòu)造函數(shù)的原型。
  3. 函數(shù)也是對象肴甸,函數(shù)也具有__proto__這個屬性寂殉,指向構(gòu)造函數(shù)Function的原型。
  4. Function可以理解為是javascript幫我們寫好的原在,Function.__proto__ === Function.prototype
  5. Object.prototype.__proto__ === null
  6. 當(dāng)調(diào)用一個對象/函數(shù)上的屬性時友扰,先去自身找,如果自身沒有庶柿,去__proto__上找(構(gòu)造該對象的構(gòu)造函數(shù)的原型村怪,xxx.__proto__),如果構(gòu)造函數(shù)的原型上沒有浮庐,去該構(gòu)造函數(shù)的原型的__proto__上找(構(gòu)造函數(shù)的原型的構(gòu)造函數(shù)的原型xxx.__proto__.__proto__)甚负,一直到找到,或者返回null為止审残。

2. 例題

const F = function () {};  //構(gòu)造函數(shù)F
const obj = new F();  //構(gòu)造函數(shù)F構(gòu)造的對象obj
Object.prototype.a = 'chris';
Function.prototype.b = '22';
console.log(obj.a);
console.log(obj.b);
console.log(F.a);
console.log(F.b);
  1. 首先看obj.a梭域,obj是一個對象,它自身沒有a這個屬性维苔,那么去它的構(gòu)造函數(shù)原型(obj.__proto__)上尋找碰辅,它的構(gòu)造函數(shù)是F,那么該構(gòu)造函數(shù)的原型是F.prototype介时,然而依然沒有没宾,那么繼續(xù)找F.prototype.__proto__F.prototype是一個對象沸柔,它的構(gòu)造函數(shù)是Object循衰,因此,找到了Object.prototype褐澎,所以obj.a輸出的是chris会钝。
  2. 再看obj.b,這里就不再贅述了,從Object.prototype開始說迁酸,在這里依然沒找到b先鱼,那么繼續(xù)向上找Object.prototype.__proto__,此時返回了null奸鬓,所以obj.b輸出的是undefined焙畔。
  3. F.aF.bF是一個函數(shù)串远,它自身沒有ab這兩個屬性宏多,那么去它的構(gòu)造函數(shù)原型(F.__proto__)上尋找,它的構(gòu)造函數(shù)是Function澡罚,那么該構(gòu)造函數(shù)的原型是Function.prototype伸但,然而依然沒有a,但是此時找到了b留搔,所以F.b輸出的是22更胖,那么繼續(xù)找Function.prototype.__proto__Function.prototype是一個對象催式,它的構(gòu)造函數(shù)是Object函喉,因此,找到了Object.prototype荣月,所以F.a輸出的是chris

3. 和原型相關(guān)的關(guān)鍵字和屬性

  1. instanceof
const obj = {};
function a() {};
console.log(obj instanceof Object);  //true
console.log(obj instanceof Function);  //false
console.log(a instanceof Object);  //true
console.log(a instanceof Function);  //true

簡單來說梳毙,可以把instanceof當(dāng)做“是”哺窄,例如上述:
obj是個對象”,就正確账锹;“obj是個方法”萌业,很明顯這是不正確的。實(shí)際上奸柬,instanceof是判斷obj的原型鏈上是否有Object的原型生年。

  1. isPrototypeOf
const obj = {};
function a() {}
console.log(Object.prototype.isPrototypeOf(obj));  //true
console.log(Function.prototype.isPrototypeOf(obj));  //false
console.log(Object.prototype.isPrototypeOf(a));  //true
console.log(Function.prototype.isPrototypeOf(a));  //true

通過isPrototypeOf來判斷obj的原型鏈上是否有object的原型。

  1. hasOwnProperty
Object.prototype.age = '22';
const obj = {
    name: 'chris'
}
console.log(obj.name); //chris
console.log(obj.age);  //22
console.log(obj.hasOwnProperty('name'));  //true
console.log(obj.hasOwnProperty('age'));  //false

判斷是自身的屬性廓奕,還是原型上的屬性抱婉。

  1. Object.create()
Object.prototype.name = 'chris';
const obj = Object.create(Object.prototype);
console.log(obj.name);  //chris

Object.prototypeobj的隱式原型創(chuàng)建obj

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桌粉,一起剝皮案震驚了整個濱河市蒸绩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铃肯,老刑警劉巖患亿,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異押逼,居然都是意外死亡步藕,警方通過查閱死者的電腦和手機(jī)惦界,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咙冗,“玉大人表锻,你說我怎么就攤上這事∑蚵Γ” “怎么了瞬逊?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仪或。 經(jīng)常有香客問我确镊,道長,這世上最難降的妖魔是什么范删? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任蕾域,我火速辦了婚禮,結(jié)果婚禮上到旦,老公的妹妹穿的比我還像新娘旨巷。我一直安慰自己,他們只是感情好添忘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布采呐。 她就那樣靜靜地躺著,像睡著了一般搁骑。 火紅的嫁衣襯著肌膚如雪斧吐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天仲器,我揣著相機(jī)與錄音煤率,去河邊找鬼。 笑死乏冀,一個胖子當(dāng)著我的面吹牛蝶糯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辆沦,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼昼捍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤控妻,失蹤者是張志新(化名)和其女友劉穎蚜印,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晚碾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年蜘犁,在試婚紗的時候發(fā)現(xiàn)自己被綠了团赁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片育拨。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖欢摄,靈堂內(nèi)的尸體忽然破棺而出熬丧,到底是詐尸還是另有隱情,我是刑警寧澤怀挠,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布析蝴,位于F島的核電站,受9級特大地震影響绿淋,放射性物質(zhì)發(fā)生泄漏闷畸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一吞滞、第九天 我趴在偏房一處隱蔽的房頂上張望佑菩。 院中可真熱鬧,春花似錦裁赠、人聲如沸殿漠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绞幌。三九已至,卻和暖如春失尖,著一層夾襖步出監(jiān)牢的瞬間啊奄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工掀潮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琼富。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓仪吧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鞠眉。 傳聞我的和親對象是個殘疾皇子薯鼠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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

  • 眾所周知js原型及原型鏈?zhǔn)呛芏嚅_發(fā)者的一個疼點(diǎn)(我也不例外),我也曾多次被問起械蹋,也問過不少其他人出皇,如果在自己沒有真...
    奔跑的痕跡閱讀 356評論 0 6
  • 為什么要理解原型和原型鏈,因?yàn)橛欣谖覀兝斫夂蛯?shí)現(xiàn) JS對象繼承哗戈。 __proto__ __proto__是什么W...
    微風(fēng)玉米閱讀 533評論 0 2
  • 構(gòu)造函數(shù)是一種特殊的方法郊艘。主要用來在創(chuàng)建對象時初始化對象, 即為對象成員變量賦初始值,總與new運(yùn)算符一起使用在創(chuàng)...
    Primers閱讀 147評論 0 0
  • 記住一句“內(nèi)功”: 「對象.__proto __ === 函數(shù).prototype」 一. prototype原...
    Jason_Shu閱讀 305評論 0 0
  • 一纱注、原型 上回講到畏浆,生成一個對象我們可以通過new構(gòu)造函數(shù)來實(shí)現(xiàn),如下: 但是狞贱,上面這樣也有個缺陷刻获,比如每個per...
    Da_xiong閱讀 345評論 0 1