函數劫持

来源:http://www.cnblogs.com/liuyongjia/archive/2017/11/23/7887541.html
-Advertisement-
Play Games

前言 前段時間接手了一個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);
}

例子很簡單,道理也很容易看明白。我想說的是,函數劫持其實有一些封裝的思想:我不關心這個方法怎麼實現,我只關心結果。 其他的內容,內部實現,其實是對我們屏蔽的。
我們劫持的方法,根本不需要關心他做了什麼,怎麼做的,只需要加入我們想加入的東西即可。這種思維方式可以用在我們平時的編程上,儘可能封裝好大部分實現,只將幾個口暴露給用戶來調用。

以上是個人理解,有不對的地方敬請指教。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java 5以前實現多線程有兩種實現方法:一種是繼承Thread類;另一種是實現Runnable介面。 兩種方式都要通過重寫run()方法來定義線程的行為,推薦使用後者,因為Java中的繼承是單繼承,一個類有一個父類,如果繼承了Thread類就無法再繼承其他類了,顯然使用Runnable介面更為靈活 ...
  • 雙向綁定是Angular的核心概念之一,它給我們帶來了思維方式的轉變:不再是DOM驅動,而是以Model為核心,在View中寫上聲明式標簽。然後,Angular就會在後臺默默的同步View的變化到Model,並將Model的變化更新到View。 雙向綁定帶來了很大的好處,但是它需要在後臺保持一隻“眼 ...
  • 1、什麼是響應式佈局 響應式佈局是Ethan Marcotte在2010年5月份提出的一個概念,這個概念是為解決移動互聯網瀏覽而誕生的。 簡而言之,就是一個網站能夠相容多個終端——而不是為每個終端做一個特定的版本。 響應式網路設計 ( RWD / AWD)的出現,目的是為移動設備提供更好的體驗,並且 ...
  • 什麼是組合模式? 組合模式(Composite):將對象組合成樹形結構以表示“部分-整體”的層次結構。 組合模式使得用戶對單個對象和組合對象的使用具有一致性。 何時使用組合模式? 當需求中是體現部分與整體層次的結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,同意地使用組合結構中的所有對象時, ...
  • 將從mysql資料庫查詢的信息,遍歷到List<>以及一些隨機數的生成。 代碼比較亂,但是方法還是對的,大家又需要的選擇看,希望對博友 有幫助,歡迎留言分享! public class subject { public string sub { get; set; } } //public clas ...
  • 1、簡述 代理模式中可以映射為現實生活中的生產者、中介商、消費者,生產者可抽象為委托類,中介商可抽象為代理類,消費者可以抽象為調用者對象。代理模式可以簡化消費者購買商品的模式,比如超市裡面可以購買各種商品,消費者只需要找到超市和超市裡面商品即可,不需跑到各個生產商品的工廠。 優點一:可以隱藏委托類的 ...
  • "《淺出篇》" "《深入篇》" ...
  • CSS樣式表全稱叫Cascading Style Sheets是一種用來表現HTML文件樣式的語言,是Web前端開發中一定會用到的排版語言,那麼Ngui中css的靈感就來自於此。與其說是靈感還不如果說是借鑒並通過精簡而來,因為開發這個框架的初衷效率一直就是最重的目標,其次才是使用體驗 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...