将本地存储与脚本结合使用。我经常想重写以实现某个功能。重写中的方法有哪些?有许多开发人员想要重写方法以实现密钥的过期时间,或者监视密钥的读写。那么,有哪些方法可以重写中的方法。localStorage localStorage localStorage localStorage
1. 直接在本地存储上重写
许多开发人员喜欢重写的想法,首先保留原始方法,然后直接在localStorage上重写该方法,如下所示。
但是,这种编写方式并不是覆盖该方法,而是向 中添加一个属性。声明方法的 value 属性时,将覆盖本机方法。setItem() setItemlocalStorage setItem()
我没有对它进行太多测试,但是在某些浏览器中,此属性将被忽略并导致我们的重写失败。
2. 覆盖localStorage.__proto__的方法
如果我们仔细观察,设置项和获取项是从存储伪属性继承的。__proto__
然后我们直接覆盖上述方法。localStorage.__proto__
这将实现该方法的实际重写。setItem()
但这里仍然存在一个问题。两者均从存储继承。在 上重写属性或方法后,中的方法也会被重写。localStoragesessionStoragelocalStorage.__proto__sessionStorage
3. 外包装层
我们不直接修改方法本身,而是在外面包一层,然后用来实现底层的存储功能。localStorage localStorage
这样,自由度相对较高,并且在第1节中没有兼容性问题。只有使用的名称已更改,并且 中的属性和方法被完全阻止。localStorage
如果要使用没有包的自定义对象,则需要实现所有属性和方法。不可能像上面这样单独嘲笑一种方法。
4. 覆盖本地存储
使用 或等效于完全覆盖变量。比第3节更好,因为名称没有改变。Object.definePropertyProxylocalStorage
4.1 直接覆盖,无效果
如果用以下方法直接覆盖,将无效果。
我们通过 获得 的属性描述符。可以发现没有可写的:true属性,这意味着它不是直接可写的。localStorage Object.getOwnPropertyDescriptor localStorage
4.2 覆盖对象.定义属性
由于没有属性,我们将向其添加一个属性。我们可以用覆盖 。writable localStorage Object.defineProperty
但是你不能使用上面的写作方法与外面的一层。如果你直接给出上面的内容,那么它将产生无限的递归(为了避免误导,错误的写作方法不会在这里写)。myLocalStorage localStorage
我已经在这里做了一个备份。如果您需要本机方法,那么您也可以操作它。localStorage
5. 总结
在本文中,我们没有专门实现诸如设置过期时间之类的功能。但是从另一个角度谈谈如何重写或其中的方法。localStorage