问题:
我可以在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);
};
答案 0 :(得分:10)
您需要存储旧功能。
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);
};
如果不这样做,每次迭代都会产生无限循环消耗堆栈空间,导致堆栈溢出,导致浏览器崩溃:)
答案 1 :(得分:2)
或者,不是创建一个新的变量来保存旧的 Storage 函数,而是可以像这样绑定你的函数。
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);
在控制台中检查时,您可以获得将新功能表示为本机代码的好处,以及更简洁的代码。
答案 2 :(得分:0)
这是正常的,你进行无限递归:在Storage.prototype.setItem中,你调用引用Storage.prototype.setItem的this.setItem。
对于Storage.prototype.getItem也一样。