我們在開發(fā)一些大型前端項(xiàng)目時(shí),會(huì)遇到這樣一種情況,某個(gè)變量上有個(gè)字段。我們想知道是哪一段程序修改了這個(gè)變量上的字段。比如全局變量window上我們自定義了一個(gè)新字段_name,我們想知道到底有哪些程序給這個(gè)字段賦了值。 一行行地調(diào)試肯定太費(fèi)時(shí)間了。如果window這個(gè)變量的_name字段被程序賦值時(shí),能執(zhí)行我們自己實(shí)現(xiàn)的一個(gè)監(jiān)聽器,這樣不就方便多了么? 監(jiān)聽器的實(shí)現(xiàn)很簡單:
使用Object對(duì)象自帶的方法defineProperty, 第一個(gè)參數(shù)為要監(jiān)聽的對(duì)象window,第二個(gè)參數(shù)為要監(jiān)聽的對(duì)象字段名稱,_name。 第三個(gè)參數(shù)是一個(gè)對(duì)象,屬性為set,意思是我們想監(jiān)聽window._name被賦值的這個(gè)事件。屬性set的值為一個(gè)JavaScript函數(shù),即我們自己定義的監(jiān)聽器。這個(gè)監(jiān)聽器,當(dāng)window._name被其他JavaScript函數(shù)修改之后,就會(huì)觸發(fā)。 測試一下,在瀏覽器里執(zhí)行上述代碼,發(fā)現(xiàn)斷點(diǎn)按照我們期望的被觸發(fā)了: 從調(diào)用棧也能發(fā)現(xiàn)確實(shí)是window._name = "2"這一行代碼觸發(fā)的斷點(diǎn),我們自己注冊的屬性修改監(jiān)聽器確實(shí)工作了。 要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注公眾號(hào)"汪子熙" |
|