深入淺出javascript對(duì)象原型

圖文并茂的幫助你更好的理解JavaScript原型.
熟記并理解以下規(guī)則,保你深入理解對(duì)象原型,保你面試無憂.

1 . 任何對(duì)象都擁有 __proto__(隱式原型) 屬性, 一般指向他們的構(gòu)造函數(shù)的原型 (prototype) .

var a = new Array () 
// a 是一個(gè)數(shù)組對(duì)象 默認(rèn)擁有__proto__ 屬性 
console.log(a.__proto__ === Array.prototype);  // true
// 白話就是 由誰創(chuàng)建 其__proto__ 就指向誰的 prototype

2 . 原型鏈的頂端是Object.prototype徘意,其 __proto__為 null

console.log(Object.prototype.__proto__ === null); // true
// 這是一個(gè)特例,為了避免JavaScript死循環(huán).

3 . 所有函數(shù)都擁有prototype (顯式原型)屬性

任何函數(shù)的 prototype.__proto__ 都指向 Object.prototype 特例見第 2

4 . 所有函數(shù)都是Function 的 實(shí)例

function fn () { 
  // some code
}
// fn 是 Function 構(gòu)造函數(shù)創(chuàng)建出來的 
// 因此 fn 的 __proto__ 屬性指向 Function 的 原型對(duì)象
console.log(fn.__proto__ === Function.prototype);  // true

類似的 十分容易就能理解

var obj = {}  // 可以看做是 var obj = new Object () 
var arr = []   //  var obj = new Array ()
// 因此他們的構(gòu)造函數(shù)分別是 Object 和 Array  
console.log(obj.__proto__ === Object.prototype); // true
console.log(arr.__proto__ === Array.prototype);    // true 

5 . 更奇葩的來了,Object Function Array 本身也都是一個(gè)函數(shù)岸晦,由于是最常用的凉唐,所以JavaScript幫我們實(shí)現(xiàn)了

// 當(dāng)我們通過構(gòu)造函數(shù)的方式來創(chuàng)建一個(gè)對(duì)象 凤优,其本質(zhì)也是new一個(gè)普通的函數(shù)
// 因此可以得出
console.log(Function.__proto__ === Function.prototype); // true
console.log(Object.__proto__ === Function.prototype );  // true
console.log(Array.__proto__ === Function.prototype);    // true
// 可印證 第4點(diǎn)

6 . 原型對(duì)象中又擁有constructor屬性,該屬性指向函數(shù)本身,這個(gè)好理解

console.log(Function.prototype.constructor === Function); // true
console.log(Object.prototype.constructor === Object);     // true
console.log(Array.prototype.constructor === Array);       // true

7 . 先普及一波 原型鏈 概念

如果想要找到一個(gè)對(duì)象的屬性,首先會(huì)先在自身查找,如果沒有,就會(huì)通過__proto__屬性一層層的向上查找,直到原型鏈的頂端 Object.prototype(__proto__: null)
這種通過某種紐帶(__proto__)將對(duì)象之間形成一種繼承關(guān)系 這種關(guān)系呈現(xiàn)出一種鏈條的形狀 將這種鏈條稱之為原型鏈

8 . 根據(jù)第 6 條可以推論得:

console.log(fn.constructor===Function); // true 
// 解析: 
// fn自身并沒有constructor屬性,所以他會(huì)順著原型鏈向上找
// fn.__proto__ 指向的是 Function.prototype 見第4
// Function.prototype.constructor  === Function
console.log(Function.constructor === Function); // true
console.log(Object.constructor === Function);   //true

9 . Function.prototype.__proto__ === Object.prototype

Function是一個(gè)特殊的例子 他創(chuàng)造了所有的函數(shù),但他自身也是一個(gè)函數(shù),他自己同時(shí)也創(chuàng)造了自己 此處見第 5 條 (感謝網(wǎng)友指出的錯(cuò)誤)

下面配合幾張?jiān)蛨D,幫助大家更好的理解.

構(gòu)造函數(shù)創(chuàng)建對(duì)象字面量原型圖

  function Animal (color) {
    this.color = color
}
var dog =  new Animal ('黑色')

當(dāng)我們創(chuàng)建一個(gè)函數(shù)時(shí)原型如下:


構(gòu)造函數(shù)創(chuàng)建對(duì)象字面量原型圖

完整對(duì)象字面量原型圖:

var obj = { name: '陳二狗' } 
完整對(duì)象字面量原型圖

數(shù)組原型鏈

var arr = ['第一個(gè)數(shù)','第二個(gè)數(shù)','第三個(gè)數(shù)']
數(shù)組原型鏈

基本包裝類型原型鏈

var str  = new String('str')  // var str = 'str'
基本包裝類型

其實(shí)所有的原型鏈規(guī)則都是根據(jù)上面的規(guī)則來的,只要能記住并理解,那么你也就理解原型了

如果有紕漏 忘指出,如果有轉(zhuǎn)載,麻煩注明作者yucccc.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尔许,一起剝皮案震驚了整個(gè)濱河市睛低,隨后出現(xiàn)的幾起案子谎痢,更是在濱河造成了極大的恐慌波丰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舶得,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爽蝴,警方通過查閱死者的電腦和手機(jī)沐批,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門纫骑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人九孩,你說我怎么就攤上這事先馆。” “怎么了躺彬?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵煤墙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我宪拥,道長(zhǎng)仿野,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任她君,我火速辦了婚禮脚作,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缔刹。我一直安慰自己球涛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布校镐。 她就那樣靜靜地躺著亿扁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸟廓。 梳的紋絲不亂的頭發(fā)上从祝,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音肝箱,去河邊找鬼哄褒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛煌张,可吹牛的內(nèi)容都是我干的呐赡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼骏融,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼链嘀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起档玻,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤怀泊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后误趴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霹琼,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枣申。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片售葡。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忠藤,靈堂內(nèi)的尸體忽然破棺而出挟伙,到底是詐尸還是另有隱情,我是刑警寧澤模孩,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布尖阔,位于F島的核電站,受9級(jí)特大地震影響榨咐,放射性物質(zhì)發(fā)生泄漏介却。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一祭芦、第九天 我趴在偏房一處隱蔽的房頂上張望筷笨。 院中可真熱鬧,春花似錦龟劲、人聲如沸胃夏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仰禀。三九已至,卻和暖如春蚕愤,著一層夾襖步出監(jiān)牢的瞬間答恶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工萍诱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悬嗓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓裕坊,卻偏偏與公主長(zhǎng)得像包竹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子籍凝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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