JS原型影暴、原型鏈深入理解

原型是JavaScript中一個比較難理解的概念括改,原型相關(guān)的屬性也比較多腻豌,對象有”prototype”屬性,函數(shù)對象有”prototype”屬性嘱能,原型對象有”constructor”屬性吝梅。

一、初識原型

在JavaScript中惹骂,原型也是一個對象苏携,通過原型可以實現(xiàn)對象的屬性繼承,JavaScript的對象中都包含了一個”[[Prototype]]”內(nèi)部屬性对粪,這個屬性所對應(yīng)的就是該對象的原型右冻。

“[[Prototype]]”作為對象的內(nèi)部屬性,是不能被直接訪問的著拭。所以為了方便查看一個對象的原型纱扭,F(xiàn)irefox和Chrome中提供了proto這個非標(biāo)準(zhǔn)(不是所有瀏覽器都支持)的訪問器(ECMA引入了標(biāo)準(zhǔn)對象原型訪問器”O(jiān)bject.getPrototype(object)”)。在JavaScript的原型對象中儡遮,還包含一個”constructor”屬性乳蛾,這個屬性對應(yīng)創(chuàng)建所有指向該原型的實例的構(gòu)造函數(shù)

二、規(guī)則

在JavaScript中鄙币,每個函數(shù) 都有一個prototype屬性屡久,當(dāng)一個函數(shù)被用作構(gòu)造函數(shù)來創(chuàng)建實例時,這個函數(shù)的prototype屬性值會被作為原型賦值給所有對象實例(也就是設(shè)置 實例的__proto__屬性)爱榔,也就是說被环,所有實例的原型引用的是函數(shù)的prototype屬性。(****只有函數(shù)對象才會有這個屬性!****)

new 的過程分為三步

????var p =newPerson('張三',20);

1.var p={}; 初始化一個對象p详幽。

2.p.proto=Person.prototype;筛欢,將對象p的proto屬性設(shè)置為 Person.prototype

3.Person.call(p,”張三”,20);調(diào)用構(gòu)造函數(shù)Person來初始化p浸锨。關(guān)于call/apply使用

三、初識Object

Object對象本身是一個函數(shù)對象版姑。(CODE TEST) 既然是Object函數(shù)柱搜,就肯定會有prototype屬性,所以可以看到”O(jiān)bject.prototype”的值就是”O(jiān)bject {}”這個原型對象剥险。反過來聪蘸,當(dāng)訪問”O(jiān)bject.prototype”對象的”constructor”這個屬性的時候,就得到了Obejct函數(shù)表制。

另外健爬,當(dāng)通過”O(jiān)bject.prototype._proto_”獲取Object原型的原型的時候,將會得到”null”么介,也就是說”O(jiān)bject {}”原型對象就是原型鏈的終點了娜遵。

四、初識Function

如上面例子中的構(gòu)造函數(shù)壤短,JavaScript中函數(shù)也是對象设拟,所以就可以通過proto查找到構(gòu)造函數(shù)對象的原型。

Function對象作為一個函數(shù)久脯,就會有prototype屬性纳胧,該屬性將對應(yīng)”function () {}”對象。

Function對象作為一個對象帘撰,就有proto屬性躲雅,該屬性對應(yīng)”Function.prototype”,也就是說骡和,”Function.proto=== Function.prototype”相赁。

在這里對“prototype”和“proto”進(jìn)行簡單的介紹:

對于所有的對象,都有proto屬性慰于,這個屬性對應(yīng)該對象的原型.

對于函數(shù)對象钮科,除了proto屬性之外,還有prototype屬性婆赠,當(dāng)一個函數(shù)被用作構(gòu)造函數(shù)來創(chuàng)建實例時绵脯,該函數(shù)的prototype屬性值將被作為原型賦值給所有對象實例(也就是設(shè)置實例的proto屬性)


原型鏈結(jié)構(gòu)圖

原型鏈

因為每個對象和原型都有原型,對象的原型指向原型對象休里,

而父的原型又指向父的父蛆挫,這種原型層層連接起來的就構(gòu)成了原型鏈。

一妙黍、屬性查找

當(dāng)查找一個對象的屬性時悴侵,JavaScript 會向上遍歷原型鏈,直到找到給定名稱的屬性為止拭嫁,到查找到達(dá)原型鏈的頂部(也就是 Object.prototype)可免,如果仍然沒有找到指定的屬性抓于,就會返回 undefined。

????functionPerson(name, age){

????????this.name = name;

????????this.age = age;??

????}?

????Person.prototype.MaxNumber =9999;

????Person.__proto__.MinNumber =-9999;

????varwill =newPerson("Will",28);

????console.log(will.MaxNumber);// 9999

????console.log(will.MinNumber);// undefined

在這個例子中分別給”Person.prototype “和” Person.proto”這兩個原型對象添加了”MaxNumber “和”MinNumber”屬性浇借,這里就需要弄清”prototype”和”proto”的區(qū)別了捉撮。

“Person.prototype “對應(yīng)的就是Person構(gòu)造出來所有實例的原型,也就是說”Person.prototype “屬于這些實例原型鏈的一部分妇垢,所以當(dāng)這些實例進(jìn)行屬性查找時候巾遭,就會引用到”Person.prototype “中的屬性。

對象創(chuàng)建方式影響原型鏈

????varJuly = {

????????name:"張三",

????age:28,

????getInfo:function(){

console.log(this.name +" is "+this.age +" years old");

}

????}

????console.log(July.getInfo());

當(dāng)使用這種方式創(chuàng)建一個對象的時候闯估,原型鏈就變成下圖了. July對象的原型是”O(jiān)bject.prototype”也就是說對象的構(gòu)建方式會影響原型鏈的形式灼舍。


{ }對象原型鏈結(jié)構(gòu)圖


綜圖所述

所有的對象都有proto屬性,該屬性對應(yīng)該對象的原型.

所有的函數(shù)對象都有prototype屬性睬愤,該屬性的值會被賦值給該函數(shù)創(chuàng)建的對3. 象的proto屬性.

所有的原型對象都有constructor屬性,該屬性對應(yīng)創(chuàng)建所有指向該原型的實例的構(gòu)造函數(shù).

函數(shù)對象和原型對象通過prototype和constructor屬性進(jìn)行相互關(guān)聯(lián).

以上就會關(guān)于JS原型纹安、原型鏈的詳細(xì)內(nèi)容介紹尤辱,希望對大家的學(xué)習(xí)有所幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厢岂,一起剝皮案震驚了整個濱河市光督,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塔粒,老刑警劉巖结借,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卒茬,居然都是意外死亡船老,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門圃酵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柳畔,“玉大人,你說我怎么就攤上這事郭赐⌒胶” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵捌锭,是天一觀的道長俘陷。 經(jīng)常有香客問我,道長观谦,這世上最難降的妖魔是什么拉盾? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮豁状,結(jié)果婚禮上盾剩,老公的妹妹穿的比我還像新娘雷激。我一直安慰自己,他們只是感情好告私,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布屎暇。 她就那樣靜靜地躺著,像睡著了一般驻粟。 火紅的嫁衣襯著肌膚如雪根悼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天蜀撑,我揣著相機與錄音挤巡,去河邊找鬼。 笑死酷麦,一個胖子當(dāng)著我的面吹牛矿卑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沃饶,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼母廷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糊肤?” 一聲冷哼從身側(cè)響起琴昆,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馆揉,沒想到半個月后业舍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡升酣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年舷暮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噩茄。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡脚牍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巢墅,到底是詐尸還是另有隱情诸狭,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布君纫,位于F島的核電站驯遇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蓄髓。R本人自食惡果不足惜叉庐,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望会喝。 院中可真熱鬧陡叠,春花似錦玩郊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兴溜,卻和暖如春侦厚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拙徽。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工刨沦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膘怕。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓想诅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岛心。 傳聞我的和親對象是個殘疾皇子来破,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

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

  • 東閣佳人添紅妝,憑欄遠(yuǎn)眺淚彷徨鹉梨。 夕頹歸舟暮色閉讳癌,鬢花映鏡秋月涼穿稳。 黃沙掩天風(fēng)蕭索存皂,鐵馬踏塵悲寂寥。 將軍西出征蒼...
    時光焰火閱讀 315評論 1 1
  • 一夜夢里花落花開逢艘。 還是被思瑤的愛心早餐叫醒旦袋,吃完早餐之后目送她出門上班。一個人懶洋洋的坐了一會兒它改,最后又趴回床上...
    山頂?shù)暮诠沸?/span>閱讀 202評論 0 0
  • 夭夭灼灼疤孕,何處奈何 忘川能擺渡?彼岸難穆央拖。 只道西風(fēng)消瘦馬 卻罷了祭阀,西廂哪戶又情長
    懂啦閱讀 246評論 0 1
  • 在未入大學(xué)之前,大學(xué)之門對我來說神秘而又遙不可及鲜戒,正因如此专控,我不斷努力、奮進(jìn)遏餐,誓死要打開這扇神秘憧憬的大門伦腐,來瞧瞧...
    Princelene閱讀 162評論 0 2