麻煩幫解釋一下什麼叫“鉤子”。
回複內容:
麻煩幫解釋一下什麼叫“鉤子”。
鉤子呢,英文叫做Hook,翻譯過來應該叫做魚鉤;
舉個例子:
你在你的鑰匙上弄一條線綁著,然後線上上面弄一個鉤子,你可以把這個鑰匙掛在衣架上,也可以把這個鑰匙掛在你的窗帘上。嗯這個也許不夠生動和形象,再來一個:
在這裡,這個衣架就相當於一個鉤子,這個鉤子的作用可以把毛巾掛到那上面的掛鈎上。
這裡大概是這樣的一個意思,在程式裡來說就是你定義了一個小功能,可以在任何想用的地方掛上去。這個小功能利用鉤子掛上去,比如評論列表展示,可以是一個鉤子,在需要的地方掛上去。
這個東西和外掛程式其實差不多,但是我覺得的話,外掛程式的功能相對於鉤子來說,更複雜,鉤子的話,功能更單一更靈活。
所以,我覺得符合鉤子思想的東西就是鉤子,程式如此,生活中的東西也如此
不知道是否準確,一個具體化的說法叫回呼函數。linux核心中就有很多這樣的機制,底層用c語言的函數指標來調用函數,頂層將該指標指向某個函數,以此來達到解耦代碼的目的
"鉤子"是一種形象的叫法,在可一“放置”鉤子的地方,我們叫其為“掛載點”
我個人對鉤子的理解就是:在一個有序的步驟中的特殊位置(掛載點),插入自訂的內容。這就叫"鉤子"。
在ThinkPHP中,有前置鉤子和後置鉤子,他們用來設定在增,刪,改,查資料前後的自訂動作。
在CodeIgniter中,鉤子更為的靈活,靈活有系統執行早起的鉤子,也有系統執行之後的鉤子。非常能滿足開發人員的極客思想。
我理解的鉤子,是指在模板方法模式的父類演算法架構中隔離容易變化部分的一種方式。
比如父類的演算法架構init()中預設依次執行A操作——B操作——C操作,正常情況下它的大部分子類也都按照這個流程來執行,但如果有一個特定的子類,它不想執行B操作,那麼我們可以在父類中封裝一個鉤子invokeB,預設為true,若且唯若它為true的時候執行B操作,然後再到子類中將繼承的invokeB設定為false,這樣調用該子類的init()的時候就會跳過B操作了。
我也來湊個熱鬧。我覺得鉤子(hook)就是:
提供一個可以影響預設的(或原有的)流程(機制)的時機
通常就是:一個庫、一個架構、一個系統或一種語言,提供一個對外公開的介面,通過這個介面,使用者能夠影響庫、架構、系統或程式的行為。
至於具體實現,那是千差萬別的。舉個例子就是有同學提到了:Java中的模板方法。
最直觀的理解就是 你要訪問某個文章 然而這個文章有許可權驗證 必須要登入會員才能訪問 那麼 這個許可權驗證的過程也可以稱之為hook鉤子 簡單地說 以某個條件觸發的行為 就是鉤子
用javascript舉個栗子:
alert是js的原生函數對不對,我們想要改造alert函數,這個時候,oriAlert就是一個鉤子函數。
var oriAlert = window.alert;window.alert = function(txt){ //改造函數 oriAlert(txt);}