將本地存儲與腳本結合使用。我經常想重寫以實現某個功能。重寫中的方法有哪些?有許多開發(fā)人員想要重寫方法以實現密鑰的過期時間,或者監(jiān)視密鑰的讀寫。那么,有哪些方法可以重寫中的方法。localStorage localStorage localStorage localStorage
1. 直接在本地存儲上重寫
許多開發(fā)人員喜歡重寫的想法,首先保留原始方法,然后直接在localStorage上重寫該方法,如下所示。
但是,這種編寫方式并不是覆蓋該方法,而是向 中添加一個屬性。聲明方法的 value 屬性時,將覆蓋本機方法。setItem() setItemlocalStorage setItem()
我沒有對它進行太多測試,但是在某些瀏覽器中,此屬性將被忽略并導致我們的重寫失敗。
2. 覆蓋localStorage.__proto__的方法
如果我們仔細觀察,設置項和獲取項是從存儲偽屬性繼承的。__proto__
然后我們直接覆蓋上述方法。localStorage.__proto__
這將實現該方法的實際重寫。setItem()
但這里仍然存在一個問題。兩者均從存儲繼承。在 上重寫屬性或方法后,中的方法也會被重寫。localStoragesessionStoragelocalStorage.__proto__sessionStorage
3. 外包裝層
我們不直接修改方法本身,而是在外面包一層,然后用來實現底層的存儲功能。localStorage localStorage
這樣,自由度相對較高,并且在第1節(jié)中沒有兼容性問題。只有使用的名稱已更改,并且 中的屬性和方法被完全阻止。localStorage
如果要使用沒有包的自定義對象,則需要實現所有屬性和方法。不可能像上面這樣單獨嘲笑一種方法。
4. 覆蓋本地存儲
使用 或等效于完全覆蓋變量。比第3節(jié)更好,因為名稱沒有改變。Object.definePropertyProxylocalStorage
4.1 直接覆蓋,無效果
如果用以下方法直接覆蓋,將無效果。
我們通過 獲得 的屬性描述符。可以發(fā)現沒有可寫的:true屬性,這意味著它不是直接可寫的。localStorage Object.getOwnPropertyDescriptor localStorage
4.2 覆蓋對象.定義屬性
由于沒有屬性,我們將向其添加一個屬性。我們可以用覆蓋 。writable localStorage Object.defineProperty
但是你不能使用上面的寫作方法與外面的一層。如果你直接給出上面的內容,那么它將產生無限的遞歸(為了避免誤導,錯誤的寫作方法不會在這里寫)。myLocalStorage localStorage
我已經在這里做了一個備份。如果您需要本機方法,那么您也可以操作它。localStorage
5. 總結
在本文中,我們沒有專門實現諸如設置過期時間之類的功能。但是從另一個角度談談如何重寫或其中的方法。localStorage