前言 前段時間接手了一個shi一樣的項目,各種代碼觸目驚心。一個文件里,一會兒4個空格縮進,一會兒2個空格縮進;各種magic number;函數形參a,b,c…… 當然這篇也不打算吐槽,也不想說什麼代碼可讀性的問題,只是想借這個機會談一下維護這樣的代碼時候用到的一個小技巧。 函數劫持 第一次看到這 ...
前言
前段時間接手了一個shi一樣的項目,各種代碼觸目驚心。一個文件里,一會兒4個空格縮進,一會兒2個空格縮進;各種magic number;函數形參a,b,c……
當然這篇也不打算吐槽,也不想說什麼代碼可讀性的問題,只是想借這個機會談一下維護這樣的代碼時候用到的一個小技巧。
函數劫持
第一次看到這個概念,是在一本web攻防的書籍上。作者提到了利用函數劫持來將一些敏感信息記錄下來或者發送到黑客的伺服器上。也在一個網站上鍵入alert時,發現並沒有彈窗,而是在console中log了出來。
我猜測,大概代碼如下:
window.alert = function (message) {
console.log('alert: ' + message.toString());
}
上面的這個例子是一個非常淺顯的函數劫持,我們也可以加一點別的內容上去。
window.alert = function (message) {
console.log('alert: ' + message.toString());
reportToMyServer(message);//把信息上報到我們自己的伺服器
}
劫持與屏蔽
先說一下需求,現在有一個修改url的函數,在許多地方被調用了,然後產品有一個小的臨時的需求,在某些情況下,加一個參數上去,其他情況不加。
修改url的參數大概實現如下:
1.需要傳入鍵值對
2.把鍵值對轉換成url拼接的形式,拼到url上,之前拼接的參數,一概不要。
不要問我為什麼要這麼實現,我知道這個實現很奇怪,但是我也不打算修改他們的代碼。只是一個小小的需求,我也不想在所以調用這個函數的地方,都再加一個鍵值對,太麻煩了,於是就想到了函數劫持。
實現
function changeUrl (obj) {
//我不想寫具體實現了,諸君腦補
//就是host + orgin + 鍵值對
}
var
foo = changeUrl
;
changeUrl = function (obj) {
obj.myParameter = 'hello-world';
foo(obj);
}
例子很簡單,道理也很容易看明白。我想說的是,函數劫持其實有一些封裝的思想:我不關心這個方法怎麼實現,我只關心結果。 其他的內容,內部實現,其實是對我們屏蔽的。
我們劫持的方法,根本不需要關心他做了什麼,怎麼做的,只需要加入我們想加入的東西即可。這種思維方式可以用在我們平時的編程上,儘可能封裝好大部分實現,只將幾個口暴露給用戶來調用。
以上是個人理解,有不對的地方敬請指教。