生命周期函數(shù)與鉤子函數(shù) - 詳解

本文介紹

本文主要講解在JavaScript中生命周期函數(shù)和鉤子函數(shù)的實(shí)現(xiàn),以及其原理借杰。

可以說(shuō)現(xiàn)在前端主流的框架都離不開(kāi)生命周期函數(shù)过吻,關(guān)于生命周期函數(shù)鉤子函數(shù),之前我經(jīng)痴岷猓看到有人將它們混為一個(gè)概念纤虽。其實(shí)還是有點(diǎn)區(qū)別的乳绕,可以說(shuō)生命周期函數(shù)可能會(huì)包含著鉤子函數(shù),但也可能不包含逼纸,所以不是一個(gè)概念刷袍。下面例子會(huì)有助于你深刻理解這一理念。

其中JavaScript中的生命周期函數(shù)的實(shí)現(xiàn)樊展,會(huì)跟其它語(yǔ)言有點(diǎn)不一樣呻纹,這個(gè)得靠自己體會(huì)了,本文只是一個(gè)牽引专缠。

說(shuō)到生命周期函數(shù)雷酪,其實(shí)還涉及到一種設(shè)計(jì)模式 - 模板方法模式,但是本文不討論涝婉,因?yàn)椴粫?huì)影響你對(duì)生命周期的理解哥力。

本文代碼風(fēng)格: ES5

內(nèi)容

生命周期

首先,來(lái)看下面代碼:

// 模擬一個(gè)動(dòng)物類
function Animal() {

}

// 由于每個(gè)動(dòng)物都會(huì)擁有該生命周期墩弯,所以寫(xiě)在prototype上
Animal.prototype = {
  constructor: Animal,
  // 假設(shè)這4步驟就是一個(gè)動(dòng)物生命中所經(jīng)歷的時(shí)期
  step1: function() {
    console.log('幼年');
  },
  step2: function() {
    console.log('少年');
  },
  step3: function() {
    console.log('中年');
  },
  step4: function() {
    console.log('老年');
  },
  // 當(dāng)執(zhí)行該方法時(shí)吩跋,就讓生命周期按順序來(lái)進(jìn)行
  init: function() {
    this.step1();
    this.step2();
    this.step3();
    this.step4();
  }
}
// 創(chuàng)建動(dòng)物
var dog = new Animal();
// 開(kāi)啟生命篇章
dog.init();

控制臺(tái)打印如下:

控制臺(tái)打印

但是,假如你是那種很有個(gè)性的人渔工,覺(jué)得用幼年锌钮、少年、中年引矩、老年來(lái)形容自己太枯燥了梁丘,你想改寫(xiě)人生,重新繪制自己生命的藍(lán)圖旺韭,那也是可以的氛谜,方法如下:

// 創(chuàng)建屬于自己的人群
function ShaMaTe() {
    
}
// 繼承自Animal
ShaMaTe.prototype = new Animal();
// 指定構(gòu)造器,對(duì)原型鏈不了解的同學(xué)忽略這句即可
ShaMaTe.prototype.constructor = ShaMaTe;
// 重寫(xiě)方法
ShaMaTe.prototype.step1 = function() {
  console.log('*﹏拗哖〆…');
}
ShaMaTe.prototype.step2 = function() {
  console.log('尐哖');
}
ShaMaTe.prototype.step3 = function() {
  console.log('筗哖');
}
ShaMaTe.prototype.step4 = function() {
  console.log('荖哖');
}

var me = new ShaMaTe()
// 開(kāi)啟人生
me.init()

你發(fā)現(xiàn)一個(gè)不一樣的人生区端,打印如下:

![控制臺(tái)打印]](http://upload-images.jianshu.io/upload_images/1486247-a2611126c669f227.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

好了值漫,生命周期函數(shù)講完了,這就是生命周期函數(shù):

  1. 按順序進(jìn)行
  2. 可以改寫(xiě)函數(shù)织盼,但函數(shù)還是按順序進(jìn)行

鉤子方法

看完生命周期函數(shù)的例子杨何,不知你有沒(méi)察覺(jué)到該例子的缺點(diǎn)沒(méi)有。那就是:在上面例子中悔政,如果一個(gè)動(dòng)物晚吞,假如它在幼年時(shí)期就死了延旧,但它還是會(huì)進(jìn)行后面的函數(shù)順序谋国。

因此在這里,我們要引入鉤子方法迁沫!

通過(guò)鉤子函數(shù)返回值芦瘾,來(lái)判斷捌蚊,來(lái)判斷人生還有沒(méi)必要再進(jìn)行下去:

// 拿第一份代碼中的Animal為例
Animal.prototype = {
  // 省略代碼...
  
  // 我們只需要對(duì)init方法進(jìn)行處理,其他保持不變
  init: function() {
    // 在這里近弟,我作一種假設(shè)缅糟,僅為舉例,具體的得按需求來(lái)
    // 動(dòng)物在幼年時(shí)期是最容易死亡了,可能會(huì)被其它動(dòng)物吃掉
    // 因此在幼年到少年期間祷愉,添加一個(gè)鉤子函數(shù),通過(guò)其返回值判斷是否繼續(xù)執(zhí)行
    this.step1();
    if (this.dieInBabyhood()) {
        return
        // 后面的不再執(zhí)行
    }
    this.step2();
    this.step3();
    this.step4();
  },
  // 然后給鉤子函數(shù)一個(gè)默認(rèn)返回值窗宦,默認(rèn)為false(不死)
  this.dieInBabyhood: function () {
    return false;
  }
}

// 創(chuàng)建動(dòng)物對(duì)象
var dog = new Animal();
// 重寫(xiě)鉤子函數(shù)
dog.dieInBabyhood = function () {
    return true;
}
// 開(kāi)啟生命周期
dog.init();

打印如下:可憐的小狗只走到了幼年

![控制臺(tái)打印]](http://upload-images.jianshu.io/upload_images/1486247-80925c080705c2d8.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

其實(shí)還有一種需求就是:在生命周期中,僅僅跳過(guò)了某時(shí)期二鳄,下面的依然還要進(jìn)行赴涵,這種需求實(shí)現(xiàn)如下:

Animal.prototype = {
  // 省略代碼...
  
  init: function() {
    this.step1();
    // 拿僅跳過(guò)step2為例
    if (!this.isCrossStep2()) {
      this.step2();
    }
    // 后面依然執(zhí)行
    this.step3();
    this.step4();
  }

總結(jié)

  1. 生命周期函數(shù)包含鉤子函數(shù)
  2. 生命周期函數(shù)可以重寫(xiě)
  3. 通過(guò)重寫(xiě)鉤子函數(shù)可以決定是否進(jìn)行某一步操作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市订讼,隨后出現(xiàn)的幾起案子髓窜,更是在濱河造成了極大的恐慌,老刑警劉巖欺殿,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寄纵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脖苏,警方通過(guò)查閱死者的電腦和手機(jī)程拭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)棍潘,“玉大人哺壶,你說(shuō)我怎么就攤上這事⊙寻” “怎么了山宾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鳍徽。 經(jīng)常有香客問(wèn)我资锰,道長(zhǎng),這世上最難降的妖魔是什么阶祭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任绷杜,我火速辦了婚禮,結(jié)果婚禮上濒募,老公的妹妹穿的比我還像新娘鞭盟。我一直安慰自己,他們只是感情好瑰剃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布齿诉。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粤剧。 梳的紋絲不亂的頭發(fā)上歇竟,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音抵恋,去河邊找鬼焕议。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弧关,可吹牛的內(nèi)容都是我干的盅安。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼世囊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宽堆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起茸习,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤畜隶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后号胚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體籽慢,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年猫胁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箱亿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弃秆,死狀恐怖届惋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菠赚,我是刑警寧澤脑豹,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站衡查,受9級(jí)特大地震影響瘩欺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拌牲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一俱饿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塌忽,春花似錦拍埠、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嬉探。三九已至,卻和暖如春坷虑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背埂奈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工迄损, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人账磺。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓芹敌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親垮抗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氏捞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,145評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)冒版,斷路器液茎,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法辞嗡,內(nèi)部類的語(yǔ)法捆等,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法续室,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,633評(píng)論 18 399
  • Vue 實(shí)例中的生命周期鉤子 本博客版權(quán)歸本人和饑人谷所有栋烤,轉(zhuǎn)載需說(shuō)明來(lái)源Vue 框架的入口就是 Vue 實(shí)例,其...
    饑人谷_小k閱讀 2,488評(píng)論 2 7
  • 天亮了挺狰,當(dāng)?shù)谝豢|陽(yáng)光灑在床邊明郭, 當(dāng)揉著睡意朦朧眼睛。 一時(shí)間也沒(méi)有想傷悲丰泊,沐浴在和煦的暖陽(yáng)里薯定。 時(shí)間不能倒流,所有...
    葉夕云閱讀 1,078評(píng)論 3 4