JavaScript之原型與原型鏈

萬物皆對象

在JavaScript中除值類型之外眯停,其他的都是對象,為了說明這點(diǎn),我們舉幾個例子
我們可以使用typeof來做類型判斷

typeof a;             // undefined
typeof 1;             // number
typeof 'wclimb';      // string
typeof true;          // boolean

typeof function(){};  // function
typeof [];            // object
typeof null;          // object
typeof {};            // object

除了undefined巷屿、numberstring墩虹、boolean屬于值類型之外嘱巾,其他都是對象。你可能要問了诫钓,不是還有一個是function嗎旬昭?要校驗(yàn)他是不是應(yīng)該對象可以這樣做:

var fn = function(){}
fn instanceof Object // true

由上面的例子所示,函數(shù)確實(shí)是對象菌湃,為什么呢问拘?我們看一下下面的例子

function Person(name){
    this.name = name; 
}
var person = new Person('wclimb');
console.log(person) // Person {name: "wclimb"}

由此我們可以得知,對象都是通過函數(shù)創(chuàng)建的,這么說你可能又會說不對骤坐,你看下面的就不是函數(shù)創(chuàng)建的

var person = {name:'wclimb'}

你咋就這么飄呢绪杏?我竟無言以對,沒錯纽绍,這是個意外蕾久、意外、意外拌夏。但是歸根結(jié)底他還是通過函數(shù)創(chuàng)建的

    var person = new Object()
    person.name = 'wclimb'

so僧著,現(xiàn)在你只要知道對象是通過函數(shù)創(chuàng)建的就可以了,來跟著我讀:
第一遍 對象都是通過函數(shù)創(chuàng)建的
第二遍 對象都是通過函數(shù)創(chuàng)建的
第三遍 對象都是通過函數(shù)創(chuàng)建的

構(gòu)造函數(shù)(constructor)

function Person(name){
    this.name = name
}
var person1 = new Person('wclimb 1')
var person2 = new Person('wclimb 2')

上面Person就是一個構(gòu)造函數(shù)辖佣,我們通過new的方式創(chuàng)建了一個實(shí)例對象person
我們來看看person1和person2的constructor(構(gòu)造函數(shù))是不是指向Person的

person1.constructor === Person // true
person2.constructor === Person // true

原型(prototype)

在JavaScript中霹抛,每定義一個函數(shù)都會產(chǎn)生一個prototype(原型)屬性,這個屬性指向函數(shù)的原型對象

function Person(){}
Person.prototype.name = 'wclimb'
Person.prototype.age = '24'
Person.prototype.sayAge = function(){
    console.log(this.age)
}
var person = new Person()
person.sayAge(); //  24

那么這個prototype到底是什么呢卷谈?跟構(gòu)造函數(shù)有關(guān)系嗎杯拐?

image

上圖就可以反映出他們之間的關(guān)系

其實(shí)函數(shù)的prototype指向函數(shù)的原型對象,每個對象都會關(guān)聯(lián)另外一個對象世蔗,也就是原型端逼,上面的例子改成:

Person.prototype = {
    name: 'wclimb',
    age: 24,
    satAge: function(){
        console.log(this.age)
    }
}

隱式原型(__proto__)

上面我們說到每定義一個函數(shù)都會產(chǎn)生一個原型,每個函數(shù)它不止有原型污淋,還有一個__proto__(隱式原型)
每個對象都有一個__proto__屬性顶滩,指向創(chuàng)建該對象函數(shù)的prototype,我們可以來試試寸爆,還是上面的例子:

function Person(){}
var person = new Person()
person.__proto__ === Person.prototype // true

現(xiàn)在他們的關(guān)系圖如下

image

由上圖我們可以知道:

Person.prototype.constructor = Person
person.__proto__ = Person.prototype
person.constructor = Person

我們可以看到person.__proto__指向構(gòu)造函數(shù)的原型礁鲁,那么構(gòu)造函數(shù)的原型即Person__proto__指向哪里呢?
我們知道構(gòu)造函數(shù)其實(shí)就是由Function來創(chuàng)建的赁豆,由此得出:

Person.__proto__ === Function.prototype

那么構(gòu)造函數(shù)的原型即Person.prototype__proto__指向哪里呢仅醇?
原型對象其實(shí)是通過Object生成的,自然而然的得出:

Person.prototype.__proto__ === Object.prototype

那么Object.prototype__proto__指向哪里呢魔种?答案是null析二,最終得到下面的圖

image

拋開這張圖,來看看下面幾道題

  1. person.__proto__
  2. Person.__proto__
  3. Person.prototype.__proto__
  4. Object.__proto__
  5. Object.prototype.__proto__

解:

  1. 每個對象都有一個__proto__屬性节预,指向創(chuàng)建該對象函數(shù)的prototype叶摄,因?yàn)镻erson是person的構(gòu)造函數(shù)
    Person === person.constructortrue,所以:person.__proto__ === Person.prototype
  2. Person構(gòu)造函數(shù)是由Function創(chuàng)建的,所以可以得出Person.__proto__ === Fucntion.prototype
  3. 我們上面說過Person.prototype其實(shí)是一個對象安拟,而對象是由Object創(chuàng)建的蛤吓,所以 Person.prototype.__proto__ === Object.prototype
  4. Object對象都是函數(shù)創(chuàng)建的,所以Object.__proto__ === Function.prototype
  5. 雖然Object.prototype是一個對象但是他的__proto__null

實(shí)例和原型

當(dāng)我們要取一個值的時候去扣,會先從實(shí)例中取柱衔,如果實(shí)例中存在樊破,則取實(shí)例的值,如果實(shí)例不存在唆铐,則會順著原型里找哲戚,直到找到

function Person(){}
Person.prototype.name = '我來自原型'

var person = new Person()
person.name = '我來自實(shí)例'
console.log(person.name); // 我來自實(shí)例
delete person.name
console.log(person.name)); // 我來自原型

首先person實(shí)例中有這個屬性,返回我來自實(shí)例,然后將它刪除之后艾岂,會從原型中招顺少,也就是person.__proto__,因?yàn)?code>Person.prototype === person.__proto__王浴,所以得到我來自原型

總結(jié)

原型和原型鏈基本已經(jīng)講解完脆炎,不過還有待完善,如有錯誤氓辣,還望指正

GitHub:wclimb

最后編輯于
?著作權(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)容

  • 點(diǎn)擊此處訪問我的github了解更多詳情 在基于類的語言中书闸,對象是類的實(shí)例,并且類可以從另一個類繼承利凑,如Java浆劲;...
    驚鴻三世閱讀 530評論 0 4
  • 原型鏈?zhǔn)且环N機(jī)制,指的是 JavaScript 每個對象都有一個內(nèi)置的 __proto__ 屬性指向創(chuàng)建它的構(gòu)造函...
    劼哥stone閱讀 4,416評論 15 80
  • ??面向?qū)ο螅∣bject-Oriented,OO)的語言有一個標(biāo)志割按,那就是它們都有類的概念膨报,而通過類可以創(chuàng)建任意...
    霜天曉閱讀 2,107評論 0 6
  • JS中原型鏈,說簡單也簡單适荣。 首先明確: 函數(shù)(Function)才有prototype屬性现柠,對象(除Object...
    前小白閱讀 3,928評論 0 9
  • 幾天前,前幾天弛矛,算是終于把龍族三看完了够吩。 橫亙連綿了好幾個時空,終于了解到了繪梨衣丈氓,這個令人心疼的姑涼的死周循。三年前...
    奕布小新閱讀 1,123評論 0 1