重写Javascript中的默认函数?
问题:重写Javascript中的默认函数?,javascript,local-storage,Javascript,Local Storage,问题: 我可以覆盖Javascript中的“默认”函数吗 背景: 在了解到存储在localStorage中的对象之间存在冲突后,我决定对所有键应用前缀以避免冲突。显然,我可以创建一个包装器函数,但是直接覆盖默认的localStorage.getItem&localStorage.setItem来考虑我的前缀会更整洁 我的示例在Firefox递归调用自身时完全杀死了它,因此它显然不接近解决方案。也许它澄清了我想要实现的目标 代码: Storage.prototype.setItem = funct
我可以覆盖Javascript中的“默认”函数吗 背景:
在了解到存储在
localStorage
中的对象之间存在冲突后,我决定对所有键应用前缀以避免冲突。显然,我可以创建一个包装器函数,但是直接覆盖默认的localStorage.getItem
&localStorage.setItem
来考虑我的前缀会更整洁
我的示例在Firefox递归调用自身时完全杀死了它,因此它显然不接近解决方案。也许它澄清了我想要实现的目标
代码:
Storage.prototype.setItem = function(key, value) {
this.setItem("prefix"+key, value);
};
Storage.prototype.getItem = function(key, value) {
return this.getItem("prefix"+key);
};
您需要存储旧函数
Storage.prototype._setItem = Storage.prototype.setItem;
Storage.prototype.setItem = function(key, value) {
this._setItem("prefix" + key, value);
};
Storage.prototype._getItem = Storage.prototype.getItem;
Storage.prototype.getItem = function(key) {
return this._getItem("prefix" + key);
};
如果不这样做,则每次迭代都会有一个无限循环占用堆栈空间,导致堆栈溢出,使浏览器崩溃:)这是正常的,您进行无限递归:在Storage.prototype.setItem中,您调用这个.setItem,它引用Storage.prototype.setItem
Storage.prototype.getItem也是如此。或者,您可以像这样绑定函数,而不是创建新变量来保存旧的存储函数
Storage.prototype.setItem = (function(key, value) {
this.call(localStorage,"prefix" + key, value);
}).bind(Storage.prototype.setItem);
Storage.prototype.getItem = (function(key) {
return this.call(localStorage,"prefix" + key);
}).bind(Storage.prototype.getItem);
在控制台中进行检查时,您可以将新函数表示为本机代码,并可以减少代码的混乱程度。两者都有:)无限递归导致堆栈溢出!在没有无限递归的情况下可能会出现堆栈溢出:Pyes,没错。但是别这样。这将由于堆栈溢出而失败。这是一个无限循环,不会产生JS错误。这是一个干净的解决方案。谢谢大家!@PaulNikonowicz是的,除非无限循环消耗一些资源。也许我应该更新我的答案:)谢谢我使用了你的答案,因为这看起来是无法撤销的,这正是我想要的。这是真的吗?据我所知不可能。