JavaScript 原型與原型鏈(三)

函數(shù)對(duì)象

對(duì)于函數(shù)對(duì)象來(lái)說(shuō),它的proto都是指向Function.prototype。函數(shù)對(duì)象可以是如下幾種構(gòu)造器:Number,Boolean,String,Object,Function,Array,RegExp,Error,Date

//舉個(gè)栗子
Number.__proto__  === Function.prototype;
Number.constructor  ===  Function

要記酌舸ⅰ:所有的構(gòu)造器都來(lái)自于Function.prototype,甚至包括根構(gòu)造器 ObjectFunction自身盖腕。
但是Math妨退、JSON一直都是以對(duì)象的形式存在的,不需要使用New锭魔,所以他們的__proto__指向的是Object.prototype.

//再舉個(gè)栗子
Math.__proto__  === Object.prototype;
Math.constructor  ===  Object

我們?cè)谥耙呀?jīng)提過(guò)例证,除了Function.prototype的類型是function,其他的構(gòu)造器的prototype都是一個(gè)對(duì)象迷捧。

typeof Function.prototype    //function
typeof Object.prototype      //Object
typeof Error.prototype       //Object
typeof Date.prototype        //Object

綜上所述:所有的構(gòu)造器的__proto__都是Function.prototype织咧,那么我們think一下Function.prototype的__proto__是什么呢?經(jīng)過(guò)驗(yàn)證得出:

Function.prototype.__proto__ === Object.prototype

從側(cè)面驗(yàn)證了所有的構(gòu)造器都是一個(gè)普通的js對(duì)象漠秋,與此同時(shí)構(gòu)造器也繼承了Object.prototype上面的所有的方法:toString笙蒙,valueOf等,而之所以Object.prototype.__proto__ === null是因?yàn)樵玩溡呀?jīng)到頂了~~~

Prototype

我們研究了這么多的原型和原型鏈的知識(shí)膛堤,但是為什么我們一定要定義prototype屬性呢手趣,對(duì)于ECMAScript中的引用類型來(lái)說(shuō),prototype是保存著他們所有實(shí)例方法的真正的地方肥荔,也就是說(shuō)我們?cè)谑褂靡恍┖芷匠5姆椒ǎ纾簍oString()和valueOf() 朝群,這些方法都是保存在prototype上面的燕耿,只不過(guò)是在使用的時(shí)候通過(guò)各自的對(duì)象進(jìn)行實(shí)例的訪問(wèn)罷了。

Object.prototype

當(dāng)我們聲明一個(gè)實(shí)例的時(shí)候:var Student = new Object()姜胖,這個(gè)時(shí)候我們發(fā)現(xiàn)Student繼承了Object的原型對(duì)象Object.prototype的所有的方法誉帅。這就是我們定義且使用prototype的初衷。右莱、
對(duì)于Js內(nèi)置的構(gòu)造器我們已經(jīng)有了一定的認(rèn)識(shí)蚜锨,我們看一下我們自己定義的構(gòu)造器,我們先定義一個(gè)Student的構(gòu)造器:

function Student(name){
  this.name = name;
}
var p = new Student ('kim')
//p.__proto__=== Student.prototype 

粗淺的解釋一下:pStudent的實(shí)例對(duì)象慢蜓,p的內(nèi)部原型總是指向Student的原型對(duì)象prototype亚再。

function Student(name){
  this.name = name;
}
var p = new Student ('kim');
///p.__proto__=== p.constructor.prototype;

因?yàn)槊恳粋€(gè)對(duì)象都有一個(gè)constructor的屬性,可以用來(lái)獲取它的構(gòu)造器晨抡,所以注釋里面的結(jié)果也是恒等于的氛悬。
現(xiàn)在我們已經(jīng)弄明白了上面是原型屬性则剃,以及構(gòu)造函數(shù)、原型如捅、__proto__之間的關(guān)系棍现,我們考慮如果我們修改來(lái)原型,會(huì)有什么影響:

function Student(name) {
    this.name = name
}
// 修改原型
Student.prototype.getName = function() {}
var p = new Student('kim')
//p.__proto__ === Student.prototype
//p.__proto__ === p.constructor.prototype

上面的情況很好被理解镜遣,但是如果現(xiàn)在的情況是我們重寫了原型己肮,那現(xiàn)在的情況還會(huì)是這樣嗎?我們看一下下面的例子:

function Student(name) {
    this.name = name
}
// 修改原型
Student.prototype ={getName: function() {}}
var p = new Student('kim')
//p.__proto__ === Student.prototype
//p.__proto__!== p.constructor.prototype

這個(gè)時(shí)候悲关,我們看到了p.__proto__!== p.constructor.prototype和上面比較發(fā)生了變化谎僻,這是為什么呢?因?yàn)?code>Student.prototype賦值的是一個(gè)直接的對(duì)象直接量坚洽,使用對(duì)象直接量方式定義的對(duì)象戈稿,他的構(gòu)造器(constructor)指向的是根構(gòu)造器Object,也就是說(shuō)Object.prototype是一個(gè)對(duì)象,這個(gè)對(duì)象就是上面最開(kāi)始打出的值,這個(gè)值和{getName: function() {}}一定是不相等的讶舰。

總結(jié)

  • 原型和原型鏈?zhǔn)荍S實(shí)現(xiàn)繼承的一種模型鞍盗。
  • 原型鏈的形成是是通過(guò)__proto__實(shí)現(xiàn)的,而不是prototype跳昼,prototype主要是進(jìn)行屬性共享的般甲。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鹅颊,隨后出現(xiàn)的幾起案子敷存,更是在濱河造成了極大的恐慌,老刑警劉巖堪伍,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锚烦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡帝雇,警方通過(guò)查閱死者的電腦和手機(jī)涮俄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尸闸,“玉大人彻亲,你說(shuō)我怎么就攤上這事∷绷” “怎么了苞尝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宦芦。 經(jīng)常有香客問(wèn)我宙址,道長(zhǎng),這世上最難降的妖魔是什么踪旷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任曼氛,我火速辦了婚禮豁辉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舀患。我一直安慰自己徽级,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布聊浅。 她就那樣靜靜地躺著餐抢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪低匙。 梳的紋絲不亂的頭發(fā)上旷痕,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音顽冶,去河邊找鬼欺抗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛强重,可吹牛的內(nèi)容都是我干的绞呈。 我是一名探鬼主播喻频,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尘颓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了迄委?” 一聲冷哼從身側(cè)響起倘要,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圾亏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后封拧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體志鹃,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年泽西,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弄跌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尝苇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埠胖,到底是詐尸還是另有隱情糠溜,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布直撤,位于F島的核電站非竿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谋竖。R本人自食惡果不足惜红柱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一承匣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锤悄,春花似錦韧骗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至隶症,卻和暖如春政模,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚂会。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工淋样, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胁住。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓趁猴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親措嵌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躲叼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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