重写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是的,除非无限循环消耗一些资源。也许我应该更新我的答案:)谢谢我使用了你的答案,因为这看起来是无法撤销的,这正是我想要的。这是真的吗?据我所知不可能。