2019-12-30:原型模式基礎

2.3原型模式

實際上,我們創(chuàng)建的每個函數(shù)都有一個prototype(原型)屬性豆巨。這個屬性是一個指針剩辟,它指向一個對象。而這個對象的用途是?包含可以由特定類型的所有實例共享的屬性和方法往扔。

按照字面意思來理解贩猎,prototype 就是 通過 構造函數(shù) ,而創(chuàng)建的對象實例的 原型對象萍膛】苑基本可以類比于java中類的概念。

使用原型對象的好處是可以讓所有對象實例分享它包含的屬性和方法蝗罗,而不必在構造函數(shù)中定義對象實例的信息艇棕。而是直接將他們添加在原型對象中,這與類的概念已經非常非常相似了串塑。

可以發(fā)現(xiàn)沼琉,page1和page2的方法相同,原因是二者的方法都取自原型對象的方法桩匪,而不是自己new一個出來

換句話說打瘪,page1和page2訪問了同一組屬性和同一個alert1函數(shù)。

1.理解原型的對象

任何時候傻昙,只要創(chuàng)建了新的函數(shù)闺骚,就會根據一組特定的規(guī)則創(chuàng)建一個prototype屬性。這個屬性指向函數(shù)的原型對象妆档。在默認情況下僻爽,所有原型對象都會自動獲取一個constructor(構造函數(shù))屬性,這個屬性包含一個指向prototype屬性所在函數(shù)的指針过吻。

如同上圖的例子:

Page是一個新函數(shù)? ==? >

page有一個prototype屬性? ==? >

Page.prototype指向原型對象? ==? >

原型對象包含一個指向prototype屬性所在函數(shù)(Page)的指針? ==? >

結論:Page.prototype.constructor = Page

原型和實現(xiàn)

創(chuàng)建一個自定義的構造函數(shù)后进泼,其原型對象只會擁有一個constructor屬性蔗衡,其他有關方法,都是從Object繼承而來乳绕。當使用構造函數(shù)創(chuàng)建實例后绞惦,實例的內部會包含一個指針,它指向構造函數(shù)的原型對象洋措,ECMA-262中管這個指針叫做[[Prototype]]济蝉,訪問時可以使用__proto__來訪問。

這個指針是用來連接實例與原型對象的菠发。

① 原型對象的constructor屬性指向構造函數(shù)

② 構造函數(shù)的prototype屬性指向原型對象

③ 實例的[[prototype]]指向原型對象

實際上我們可以發(fā)現(xiàn)王滤,兩個實例person1和person2中都不包含具體的方法sayName(),但是我們卻可以調用person1.sayName(),這是通過查找對象屬性的過程來實現(xiàn)的滓鸠。

檢查一個實現(xiàn)與原型對象是否存在關系可以使用原型對象.isPrototype()

當一個實例的[[Prototype]]指向調用isPrototype()的原型對象時雁乡,這個函數(shù)就會返回true:

//p1 是 實例??

//Person函數(shù) 是 構造函數(shù)??

//Person.prototype 是 原型對象

原型對象的isPrototypeOf(實例) = true

Person.prototype.isPrototypeOf(p1) = true

另外有一個新方法使得我們可以通過實例獲取原型對象:Object.getPrototypeOf(實例)

獲取到了原型對象

獲取到原型對象之后,我們便可以訪問原型對象中自定義的屬性的值糜俗,也可以更改原型對象中自定義的屬性的值踱稍。


每當代碼讀取某個實例的某個屬性時,都會執(zhí)行一次搜索悠抹,搜索目標時給定名字的屬性珠月。首先從實例本身開始,如果在實例中找到具有給定名稱的屬性楔敌,則返回啤挎;如果沒有找到,則搜索指針指向實例的原型對象卵凑,如果在原型對象中找到具有給定名稱的屬性庆聘,則返回;否則就會報錯:并沒有定義該屬性氛谜。

說白了掏觉,當我們訪問一個屬性時,它會先問:

實例有這個屬性嗎值漫?有-返回,沒有-繼續(xù)請問實例的原型對象织盼。

實例的原型對象有這個屬性嗎杨何? 有-返回,沒有-報錯沥邻。

因此危虱,如果在原型對象和實例中定義了命名相同的值,那么訪問實例的時候唐全,只會返回實例中定義的值埃跷。這并不是說你通過為實例的屬性賦值而更改了原型對象中的某個屬性值蕊玷,而是在搜索時第一次提問便拿到了結果,所以根本就沒有執(zhí)行第二次提問弥雹。

舉個例子

如果我們想重新訪問實例對應的原型對象中的某個屬性的話垃帅,就可以i使用delete 實例.屬性,這樣就能清除實例中的屬性值剪勿,進而訪問原型對象中的屬性了贸诚。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厕吉,隨后出現(xiàn)的幾起案子酱固,更是在濱河造成了極大的恐慌,老刑警劉巖头朱,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件运悲,死亡現(xiàn)場離奇詭異,居然都是意外死亡项钮,警方通過查閱死者的電腦和手機扇苞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寄纵,“玉大人鳖敷,你說我怎么就攤上這事〕淌茫” “怎么了定踱?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恃鞋。 經常有香客問我崖媚,道長,這世上最難降的妖魔是什么恤浪? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任畅哑,我火速辦了婚禮,結果婚禮上水由,老公的妹妹穿的比我還像新娘荠呐。我一直安慰自己,他們只是感情好砂客,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布泥张。 她就那樣靜靜地躺著,像睡著了一般鞠值。 火紅的嫁衣襯著肌膚如雪媚创。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天彤恶,我揣著相機與錄音钞钙,去河邊找鬼鳄橘。 笑死,一個胖子當著我的面吹牛芒炼,可吹牛的內容都是我干的瘫怜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼焕议,長吁一口氣:“原來是場噩夢啊……” “哼宝磨!你這毒婦竟也來了?” 一聲冷哼從身側響起盅安,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唤锉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后别瞭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窿祥,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年蝙寨,在試婚紗的時候發(fā)現(xiàn)自己被綠了晒衩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡墙歪,死狀恐怖听系,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情虹菲,我是刑警寧澤靠胜,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站毕源,受9級特大地震影響浪漠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜霎褐,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一址愿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冻璃,春花似錦响谓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拍埠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間土居,已是汗流浹背枣购。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工嬉探, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棉圈。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓涩堤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親分瘾。 傳聞我的和親對象是個殘疾皇子胎围,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355